作者喜欢写for循环。
本文内代码均采用使用GCC编译器,C99标准。
注意点
本文为从小到大排序。
交换迭代次数除了插入排序都为n-1次,n为数组长度。
直接交换排序
每迭代一次就让当前的最小数排到前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void zhijie(int arr[], int len) { int i, j, t; printf("直接交换排序:\n"); for(int i=0; i<len-1; i++) { for(j=i+1; j<len; j++) if(arr[i]>arr[j]) { t=arr[i]; arr[i]=arr[j]; arr[j]=t; }
for(j=0; j<len; j++) printf("%d ", arr[j]); printf("\n"); } }
|
选择排序
与直接交换排序相似,选择排序不同之处为迭代一次仅交换一对元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void selection_sort(int arr[], int len) { int i, j, t; printf("选择排序:\n"); for(i=0; i<len-1; i++) { int at=i; for(j=i+1; j<len; j++) if(arr[at]>arr[j]) at=j; t = arr[i]; arr[i] = arr[at]; arr[at] = t;
for(j=0; j<len; j++) printf("%d ", arr[j]); printf("\n"); } }
|
冒泡排序
每迭代一次就让当前最大数移动到末尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void maopao(int arr[], int len) { int i, j, t; printf("冒泡排序:\n"); for(i=0; i<len-1; i++) { for(j=0; j<len-i-1; j++) if(arr[j]>arr[j+1]) { t=arr[j];arr[j]=arr[j+1];arr[j+1]=t; }
for(j=0; j<len; j++) printf("%d ", arr[j]); printf("\n"); } }
|
插入排序
每迭代一次,排序好的范围又增加一位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void insertion_sort(int arr[], int len) { int i,j,t; for(i=1; i<len; i++) { for(t=arr[i], j=i-1; j>=0; j--) { if(arr[j] > t) { arr[j+1]=arr[j]; arr[j]=t; } } for(j=0; j<len; j++) printf("%d ", arr[j]); printf("\n"); } }
|