选择排序的思路非常简单,就是依次从头到尾挑选合适的元素放到前面。如果总共有n个节点,那么选择一个合适的节点需要比较n次,而总共要选择n次,因此总的时间复杂度是O(n2)。

选择排序的思路是,假设有一个数组:3  2  5  1  7

假设第一个数为最小值和后续的数字进行比较,如 3>2 ,此时min的值=2,让2继续进行比较,

当2>1,这时min=1,当for结循环束,没有比1更小的数时,使用一个for循环找到最小值的坐标如这个数组中 1 的下标为 3 (数组的下标从0 开始),设置一个中间变量d,第一次选择排序就是

a[0]=3,min=1;

d=a[0];

a[0]=min;

a[3]=d;交换数值后,a[0]=1,a[3]=3

则第一次选择排序后 数组:1  2  5  3  7。后续以此类推,将a[0],a[1]......慢慢选择到合适的位置

void sort(int a[],int len)
{int min,d,k=0;for(int i=0;i<len-1;i++){  min=a[i];                  //假设a[i]为最少值for(int j=i+1;j<len;j++){if(min>a[j])              //判断后续的数字若是小于min{min=a[j];              //将a[j]设置为最低值,继续进行排序k++;                   } }if(k!=0)                 //判断是否进行了交换数值{for(int m=1;m<len;m++){if(a[m]==min)   //寻找最小值的坐标,进行交换{d=a[i];a[i]=min;a[m]=d;}}           }k=0;}

代码演示效果如下:

代码如下:有需要的小伙伴可以参考(可以根据题目条件进行修改代码)

#include<stdio.h>void sort(int a[],int len)
{int min,d,k=0;for(int i=0;i<len-1;i++){  min=a[i];                  //假设a[i]为最少值for(int j=i+1;j<len;j++){if(min>a[j])              //判断后续的数字若是小于min{min=a[j];              //将a[j]设置为最低值,继续进行排序k++;                   } }if(k!=0)                 //判断是否进行了交换数值{for(int m=1;m<len;m++){if(a[m]==min)   //寻找最小值的坐标,进行交换{d=a[i];a[i]=min;a[m]=d;}}           }k=0;}printf("排序后的数组:");for(int i=0;i<len;i++){printf("%d\t\t",a[i]);}}int main()
{  int j,a[5]={0};int len=sizeof(a)/sizeof(int); printf("请输入任意的5个数:\n");for(int j=0;j<5;j++){scanf("%d",&a[j]);}printf("排序前的数组:");for(int j=0;j<5;j++){printf("%d\t\t",a[j]);}printf("\n");sort(a,len);
}

快速排序

快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。

快速排序的核心点就是找到一个支点如上图所示。

核心代码如下我带大家一步步看,假设现有一个7个数的数组:54  3  95  14  67  9  20

从注释快速排序中开始看,将数组和长度传入partion,定义i和j将数组中的第一位和最后一位标记出

54  3  95  14  67  9  20

i                                 j           开始判断右边是否小于左边,如果小于退出,并且交换数值。

第一次交换后数组成              20  3  95  14  67  9  54           开始第二次判断

i                               j

第二次交换后数组                  20  3  54  14  67  9  95           返回 i 的值 i=2

i                      j

返回后再次进行函数,不过这次的数组长度为2,数组  20  3      交换后  数组 3  20

在进行一次函数,函数从arr[3]开始,数组长度为4,数组            14  67  9  95

i                 j

交换后的数组                                                                                 9  67  14  95

i           j

交换                                                                                               9   14  67  95

i     j

第一次快速排序后,数组  3  20  54  9  14  67  95,第一次快速排序后数组并非出现规律状

第二次快快速排序后,数组  3  14  20  9  54  67  95,第二次快速排序中出现支点54

快速排序理解起来比较麻烦,但快速排序是常用的排序方法,可以用草稿纸慢慢理解。

int partion(int *arr, int len)
{int i, j;if(len <= 1)return 0;i = 0;j = len-1;while(i < j){//找到右边小于左边值,则退出while( arr[i] < arr[j] && i < j) //只要右边比左边大,j可以向左移动{j--;}swap(&arr[i], &arr[j]);//找到左边大于右边值,则退出while( arr[i] <= arr[j] && i < j)  //只要右边比左边大,i可以向右移动{i++; }       swap(&arr[i], &arr[j]);}//返回支点return i;
}//快速排序
void quicksort(int *arr,int len)
{if(len <= 1)return;int pivot = partion(arr, len);//   display(arr, len);quicksort(arr, pivot);quicksort(arr+pivot+1, len-pivot-1);} void swap(int *a, int *b)
{int tmp;tmp = *a;*a = *b;*b = tmp;
}

代码演示效果如下:

代码如下:

#include <stdio.h>//快速排序
void quicksort(int *p,int len);//交换数值
void swap(int *a, int *b);//输出数组
void display(int *arr, int len);int main(void)
{int i, len;int arr[7];len = sizeof(arr)/sizeof(int);printf("请输入7个整数:\n");for(i=0; i<7; i++){scanf("%d", &arr[i]);}printf("排序前数据:\n");display(arr, len);quicksort(arr, len);printf("排序后数据:\n");display(arr, len);
}int partion(int *arr, int len)
{int i, j;if(len <= 1)return 0;i = 0;j = len-1;while(i < j){//找到右边小于左边值,则退出while( arr[i] < arr[j] && i < j) //只要右边比左边大,j可以向左移动{j--;}swap(&arr[i], &arr[j]);//找到左边大于右边值,则退出while( arr[i] <= arr[j] && i < j)  //只要右边比左边大,i可以向右移动{i++; }       swap(&arr[i], &arr[j]);}//返回支点return i;
}//快速排序
void quicksort(int *arr,int len)
{if(len <= 1)return;int pivot = partion(arr, len);//   display(arr, len);quicksort(arr, pivot);quicksort(arr+pivot+1, len-pivot-1);} void swap(int *a, int *b)
{int tmp;tmp = *a;*a = *b;*b = tmp;
}//输出数组
void display(int *arr, int len)
{int i;for(i=0; i<len; i++){printf("%d\t", arr[i]);}    printf("\n");
}

简易的选择排序与快速排序相关推荐

  1. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  2. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  3. iOS swift 选择排序 冒泡排序 快速排序

    返回上级目录:iOS 算法题 三大经典排序 | 冒泡排序,选择排序,快速排序 - 知乎 文章目录 1.选择排序 2.冒泡排序 3.快速排序 1.选择排序 //选择排序 func rankSelect( ...

  4. 【C语言冒泡排序、选择排序和快速排序】

    文章目录 前言 一.冒泡排序 二.选择排序 三. 快速排序 四.代码设计与实现 代码设计 代码实现 调试结果 冒泡排序改良 延伸思考 总结 前言 本文简单介绍了C语言的冒泡排序.选择排序.快速排序,结 ...

  5. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  6. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  7. JS-排序详解:冒泡排序、选择排序和快速排序

    JS-排序详解-冒泡排序 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在 ...

  8. 插入排序、选择排序、快速排序以及归并排序(附Python代码)

    排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...

  9. python3写冒泡排序_使用python3实现冒泡排序、选择排序和快速排序

    冒泡排序的时间复杂度是O(n^2),选择排序的时间复杂度也是O(n^2),这是因为这两种排序算法的元素比较次数是相同的.但因为冒泡排序是每比较一次,就会交换一次,而选择排序是每一轮循环结束后才进行一次 ...

最新文章

  1. 英语发音规则---N字母
  2. linux 设备管理工具 udev 规则编写
  3. 魔方机器人需要特制魔方吗_解魔方的机器人攻略18 – 魔方快速算法
  4. Graphviz:利用可视化工具Graphviz将dot数据进行图像可视化或者图像保存(两大方法)之详细攻略
  5. windows server 2012 磁盘整理功能 试用 chkdsk
  6. centos 安装Jitsi架设_Docker学习6:docker安装centos7
  7. ------webkitformboundary
  8. java Int数据工具类
  9. 已知二叉树先序和中序,求后序。
  10. VB 注册ocx控件的方法
  11. iphone双重认证关闭不了怎么办_苹果手机双重认证怎么关闭-互盾苹果恢复精灵...
  12. 【制作】基于金沙滩51单片机的电子跑表
  13. 个人网站、公众号申请微信个人支付接口
  14. 速看四川省企业技术中心拟认定名单已发布,共181家
  15. 这样的生产计划与排产,我看行
  16. Class6 基于ECS和NAS搭建个人网盘
  17. 今日睡眠质量记录79
  18. 统计学原理----算术平均数和调和平均数
  19. 全国青少年软件编程等级考试Python标准解读(1_6级)
  20. hexo butterfly主题添加备案信息

热门文章

  1. docker安装nginx1.20.2并配置nginx.conf
  2. 职场新人想要快速成长?这些excel技巧需要懂!
  3. 思维导图软件哪个好?安利八款好用的思维导图软件
  4. 主从数据库部署(centos7)
  5. 万信金融项目学习笔记
  6. 互联网企业安全高级指南读书笔记之安全管理体系
  7. 图片怎么压缩到200k以内?图片压缩怎么指定大小?
  8. Hadoop搭建、环境配置
  9. 小学成绩统计软件薪火数据,是一款帮班主任老师轻松搞定成绩统计的软件,它不仅能对学生的成绩进行统计,还能把成绩进行分析打印,让老师们轻松直观的看到学生成绩的情况。
  10. GUI 图形用户界面编程(八)选择界面-当女友穿上女仆装,你是选择接着改bug还是要去......