排序算法有很多,包括
冒泡排序快速排序。选择排序插入排序堆排序桶排序归并排序计数排序基数排序插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。
主要排序比较
1、冒泡排序
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
工作原理: 以从小到大为例 (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。A B C D (A>B) (2)A>B则A与B交换,现在原B的二号位置上是数据A,A再和C比,以此类推大于则交换,向后比对 (3)步骤(2)完成则最后一位变为最大数,所以继续重复(2)但数组数量-1(即不在比对最后一位) (4)重复步骤(2)(3),直到没有任何一对数字需要比较。
示例
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = (int) sizeof(arr) / sizeof(*arr); int i, j, temp; for (i = 0; i < len - 1; i++){ for (j = 0; j < len - 1 - i; j++){ if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //打印数组 for(i = 0 ;i < len; i++) { printf("%d ",arr[i]); }执行结果 5 9 22 32 34 35 37 50 55 64 70 82 89
2、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。
工作原理: 以从小到大为例 (1)数组的第一位arr[0]和全数组一一进行比较、如果arr[0]大于arr[1],则交换数据 (2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 (3)以此类推,直到所有元素均排序完毕。
示例
int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = (int) sizeof(arr) / sizeof(*arr); int i, j, temp; for (i = 0; i <= len - 1; i++){ for (j = i; j <= len; j++){ if (arr[i] > arr[j]) { temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } } //打印数组 for(i = 0 ;i < len; i++) { printf("%d ",arr[i]); }执行结果 3 5 9 22 32 34 35 37 50 55 64 70 82 89
3、快速排序算法
快速排序(Quicksort)是对冒泡排序的一种改进。
工作原理: 以从小到大为例 (1)设置两个变量i、j,排序开始的时候:i=0,j=len-1; (2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; (3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换; (4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换; (5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
示例
执行结果