当我们要对C中一组数据进行排序是常见的排序方法有冒泡法、选择法、插入法
冒泡排序法(升序):假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:先比较a[0]与a[1]、a[1]与a[2]...a[i]与a[i+1]...a[n-1]与a[n]的大小,如果a[i]与a[i+1]不是升序(即a[i] > a[i+1]),那么就将a[i]与a[i+1]的值互换,第一轮过后,a[n]就是最大值;第二轮:运用第一轮同样的方法,比较a[0]与a[1]、a[1]与a[2]...a[i]与a[i+1]...a[n-2]与a[n-1],a[n-1]就是剩下的中最大;以此类推,n-1轮过后,数组的顺序就是按照升序排列的
1 int bubbleSort(int array[],int n){ 2 int temp; //中间变量 3 4 for(int i = 0; i < n - 1; i++){ 5 for(int j = 0;j < 9 - i;j++){ 6 // 如果相邻的两个元素不是升序,则交换两个元素的值 7 if (array[j] > array[j + 1]) { 8 temp = array[j]; 9 array[j] = array[j + 1]; 10 array[j + 1] = temp; 11 } 12 } 13 } 14 15 }
冒泡法示意图(5个元素的数组):
选择排序法(升序):假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:将a[0]的值与其后面每一个数进行比较,若a[0]大,互换两数的值,否则不动,第一轮过后,a[0]的值就是数组中最小的;第二轮:将a[1]与其后面的每一个数进行跟第一轮相同的比较,此轮过后a[1]的值就是剩下的最小的值;以此类推,n-1轮过后,数组的顺序就是按照升序排列的
1 void selectSort(int array[], int n){ 2 int temp; 3 4 for (int i = 0; i < n -1; i++) { 5 for (int j = i + 1; j <n; j++) { 6 7 if (array[i] > array[j]) { 8 temp = array[j]; 9 array[j] = array[i]; 10 array[i] = temp; 11 12 } 13 } 14 } 15 }
上述代码中由于是遇到array[i] > array[j],就交换两者的数值,这样做一旦遇到大点的数据,就会降低排序的效率,在每一轮中我可以将最小数的小标记录下来最后再与a[i]进行互换,这样就会大大提升排序的效率,代码如下:
1 void selectSort(int array[], int n){ 2 int min,temp; 3 4 for (int i = 0; i < n -1; i++) { 5 min = i; //假设下标i的元素值最小 6 for (int j = i + 1; j <n; j++) { 7 //循环把比array[min]数值小的元素下标赋值给min 8 if (array[min] > array[j]) { 9 min = j; 10 11 } 12 } 13 //内循环结束后将最小数array[min]和a[i]互换 14 if(i != min){ 15 temp = array[min]; 16 array[min] = array[i]; 17 array[i] = temp; 18 } 19 } 20 }
选择法示意图:(5个元素的数组)
插入排序法(升序):又称直接插入排序,法这种排序的思路是逐个将无序的数组中元素放到有序数组中的正确的位置。假设一组数据a[0]、a[1]、a[2]、a[3]...a[n],第一轮:把a[0]看做有序的单元素数组,将a[1]放入合适的位置,这样a[0]、a[1]就是一个新的有序数组;第二轮:将a[2]放入有序的数组中合适的位置,这样a[0]、a[1]、a[2]就是新的有序数组,以此类推,最后经过n-1轮的插入,数组的顺序就是按照升序排列的
1 int insertSort(int array[],int n){ 2 for(int i = 1;i < n;i++) //外部循环,从第二个数开始到最后一个数进行n-1次插入 3 { 4 temp = array[i]; //需要插入的数赋值给变量temp 5 for(int j = i-1; j >= 0&&t < array[j]; j--) //内部循环,将需要插入的数与其前面的数逐个递减比较 6 array[j + 1] = array[j]; //进入循环说明当前值比插入的数大,此时将当前值往后移一位 7 array[j+1] = temp; //跳出内部循环说明当前值比插入的数小,此时将要插入的数赋值给前面的数 8 9 } 10 }
插入法示意图(升序):
注:关于不同C排序方法的优缺点以及其他方法可阅读C语言中文网或参照百度文库地址为:
http://wenku.baidu.com/view/c3054c0f7cd184254b353516.html