选择法排序

选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最小的那个交换位置,以此类推,直到最后一个数字。
例如输入数组{7,5,4,8,6,2,3}
第一次排序通过查找最小的数字,交换7与2的位置;第二次查找5后面最小的数字,找到了3,交换5与3的位置;第三次查找4之后最小的数字,发现并没有数字比4小,交换4与4的位置(相当于没有改变);第四次查找8后面最小的数字5,交换8与5的位置。

起始值 7 5 4 8 6 2 3
第一次排序 2 5 4 8 6 7 3
第二次排序 2 3 4 8 6 7 5
第三次排序 2 3 4 5 6 7 8

因为剩下的数字中,可能有不止一个数字比当前数字小,所以需要一个临时值来储存当前最小的数字,还需要一个标志位来记录当前最小数字对应的位号。实现代码如下:

for(i = 0;i < n-1;i++)
{temp = a[i];iPot = i;for(j = i+1;j < 10;j++)  //从每一个数字依次向后查找{if(a[j] < temp){temp = a[j];   //记录当前查找到的最小值与最小值对应的位号iPot = j;}}    a[iPot] = a[i];a[i] = temp;
}

选择法排序逻辑简单,容易实现。共需要进行(n-1)!次比较,(n-1)次交换位置。计算量是固定的。对于较大的n运算速度较慢。

冒泡法排序

冒泡法排序是指:在排序时,每次比较数组中的相邻两个数组元素的值,将较小的数排在较大的数前面。
例如还是输入数组{7,5,4,8,6,2,3}

7 5 4 8 6 2 3

先比较2与3的大小,此时无需交换位置。
再比较6与2的大小,将2排在6的前面。

7 5 4 8 2 6 3

再比较2与8的大小,将2排在8的前面。

7 5 4 2 8 6 3

来看看代码是怎么实现的

int a[10];
int temp;
for(int i = 0;i < 10;i++)
{for(int j = 9;j > i;j--){if(a[j] < a[j-1]){temp = a[j];a[j] = a[j-1];a[j-1] = temp;}}
}

这里的内循环for(int j = 9; j > i ; j --),只能从大到小递减来对比,这样才能保证可以把最小的数排到前面去。如果用for(int j = i+1;j < 9; j ++) 则无法保证把最小的数排到前面来。只有内外循环交错才能保证排序顺利进行。冒泡法排序是相对稳定的排序方法。

交换法排序

交换法排序是将每一位数与它之后的所有数字对比,如果发现比它小的数字,那么立即交换这两个数字的位置,连续向后对比直至最后一个数;然后再使用第二个数同样依次向后对比,直到排序完成。交换法排序和前面的选择法排序有些类似,选择法是找出后面最小的那个数字交换位置,而交换法则是后面只要有比当前数字小的值,立即交换位置,再继续对比。这样可以节约记录中间值和记录中间值对应位号的2个空间。但是需要更多次的交换运算。在数组基本有序时速度比选择法快。

int a[10];for(i = 0;i <9;i++)
{for(j = i+1;j < 10;j++){if(a[j] < a[i]){temp = a[i];a[i] = a[j];a[j] = temp;}}
}

插入法排序

插入法排序比较复杂,基本原理就是抽出一个数据,寻找相应的位置插入,再抽出一个数据,寻找相应的位置插入,直到完成排序。简单来说就是,对于一个数组来说,先取数组中的第二个数字,和第一个数字对比,如果比第一个数字小,则放到第一个数字前面;如果比第一个数字大,则放到第一个数字后面。然后取数组中第三个数字,与第二个数字和第一个数字对比,以此类推。

int a[10];
int iPos;for(i = 1;i < 10;i++)
{temp = a[i];  //待插入的数字iPos = i-1;while((iPos >= 0) && (a[iPos] > temp)){a[iPos+1] = a[iPos];iPos--;}a[iPos+1] = temp;
}

假设现在有这样一段数列{1,2,3,6,9} 而下一个待插入的数是 a[5] = 4
也就是待插入值temp = 4,i = 5,iPos=4 那么函数是这样运行的:

先对比待插入的值temp 与 a[4] = 6 的大小,此时temp = 4,满足while循环,那么就把原来a[4]的值放在a[5]上

1 2 3 6 9
1 2 3 6 9

此时iPos自减,仍然满足while循环条件,继续执行while循环代码。再来对比temp与a[3]的大小,此时temp仍然为4,在while循环里并没有更改temp的值。发现a[3]还是小于temp,于是继续把a[3]也往后放一个,放到a[4]的位置。

1 2 3 6 9
1 2 3 6 9

此时iPos自减,但是因为a[2] = 3,那么a[2]的值比temp小,所以while循环结束,跳出循环。只需要将待插入的值temp的值填在此时空出来的a[iPos+1] 的位置即可。

1 2 3 4 6 9

折半法排序

折半法排序又称为快速排序,是选取一个中间值,然后把比中间值小的数字放在左边,比中间值大的数字放在右边。然后两边分别递归使用这个过程。折半法排序对于较大的n时有较快的运算速度,但是折半法排序是不稳定的,对应有相同关键字的记录,排序后结果可能会颠倒次序。但是可以通过对这种排序方法的学习,来熟悉了解一些递归的思想,以及二分法的实现。

CelerityRun(int left,int right,int array[])
{int i,j;int middle;int temp;i = left;j = right;middle = array[((right - left) >> 1) + left]; //实际这里的middle可以取左右边界内任意的一个值do{while((array[i] < middle) && (i < right)){i++;}while((array[j] > middle) && (j > left)){j--;}if(i<=j){temp = array[i];array[i] = array[j];array[j] = array[i];i++;j--;}}while(i<=j)if(left < j)CelerityRun(left,j,array);if(right > i)CelerityRun(i,right,array);
}

在do while整个循环的过程中,middle的值是不变的

C语言中数组的排序算法——选择法、冒泡法、交换法、插入法、折半法

C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法相关推荐

  1. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  2. C语言中数组长度的计算详解

    一. C语言中计算数组长度大小 C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用: C语言数组长度的大小可以使用: int main() {int ...

  3. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  4. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  5. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  6. js排序算法详解-计数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-计数排序 计数排序就是遍历数组记录数组下的元素出现过多次,然后把这个元素找个位置先安置下来,简单点说就是以原数 ...

  7. js排序算法详解-堆排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-堆排序 这种排序方式呢,理论性太强,看动图的时候满脸写着懵逼,多看几遍似乎明白了编者的意图,但是要把这种理论的 ...

  8. js排序算法详解-快速排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-快速排序 既然是快速排序,那顾名思义一定很快,快的连小编都被懵逼了好几圈!建议先不要看动图,先看第一种写法: ...

  9. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

最新文章

  1. 我的新浪微博,顺便总结下近况
  2. 为什么Java 8中不再需要StringBuilder拼接字符串
  3. LeetCode 75 Sort Colors(颜色排序)
  4. 通过Python实现某个目录下所有文件(包含子目录中的文件)的列出
  5. tcga数据下载_TCGA数据下载(mRNA)
  6. (待解决!)jmx在PetClinic中的应用
  7. java去除以张开头的人名_java正则表达式去除html中所有的标签和特殊HTML字符(以开头的)...
  8. 运用“异或”对原文加密,并解密
  9. 实战flex:模拟实现静态知乎首页
  10. VIIRS 学习资料分享
  11. flash cs4 调整渐变工具
  12. utf8编码在线转换html,utf8 gb2312编码在线转换工具
  13. 计算机usb接口电压不稳定,如何处理笔记本电脑USB接口的电源不足或电压不稳定?...
  14. 穿越Java - 基础篇 第三章 面向对象介绍 | 第4节 成员变量和局部变量
  15. 案例分享 | ASA广告竞争背后的“爱与和平”
  16. matlab trapz二重积分函数_matlab数值微积分
  17. 网络报表学习体会心得!
  18. 计算机水平二级指什么,全国计算机二级是什么
  19. oracle exportdmp,Oracle导入导出dmp表
  20. STM32学习笔记(一)——如何下载程序到STM32单片机

热门文章

  1. tyvj1939 玉蟾宫
  2. 学生宿舍管理系统java课设_JAVA学生宿舍管理系统
  3. 什么是IDU和ODU
  4. C++ std::regex | 正则表达式
  5. python毕业设计作品基于django框架 校园二手书籍交易系统毕设成品(4)开题报告
  6. Vue教程-可视化图表
  7. qq图的理解以及python的实现
  8. 第一单元 用python学习微积分(三) 求导四则运算及三角函数(下)- 三角函数
  9. 20年ICPC澳门站L - Random Permutation
  10. 霍学文:大数据重塑未来金融监管方式