如:对 5,3,5,2,8 进行排序
初始化:申请一个大小为10的数组 int a[10],并将a[0]~a[10]初始化为0;
for (i = 0; i <= 10; i++) { a[i] = 0; }
记录次数:进行for循环,用a[i]的值记录5,3,5,2,8这几个数出现的次数;
for (i = 1; i <= 10; i++) { scanf("%d", &t); a[t]++; };
输出:
// 从小到大 for (i = 0; i <= 10; i++) { for (j = 1; j <= a[i]; j++) { printf("%d ", i); } }
// 从大到小 for (i = 10; i >= 0; i--) { for (j = 1; j <= a[i]; j++) { printf("%d ", i); } }
核心思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来
如:对 5,3,5,2,8进行排序
第一位需要执行4次交换,第二位需要执行3次交换,第三位需要执行2次交换,第四位需要执行1次交换,一共4趟;
总结:n个数,需要n-1趟,第i趟执行n-i次交换。
for (i = 1; i <= n - 1; i++) // 外层决定趟数 { for (j = 1; j <= n - i; j++) // 内层决定交换次数 { if (a[j] < a[j + 1]) //对相邻的数进行交换 { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } }
对 6 1 2 7 9 3 4 5 10 8 这10个数进行排序
首先在这个序列中随便找一个数作为基准数,这里把6作为基准数,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在 6的左边,如下:
实现方法:
int a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
int temp = a[1];
int i = 1 , j =10;
j--
,当移动到大于6的数,再让i++
,当移动到小于6的数时,将a[i],a[j]
进行交换;while (i != j) { while (a[j] >= temp && j > i) { j--; }; while (a[i] <= temp && i < j) { i++; } if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } }
当i与j重合时,再将a[i]=a[j]
与temp
进行交换
然后再对6两边的序列进行相同的处理;
根据该思想封装的函数如下:
// 4_快速排序 #include <stdio.h> int a[101], n; void quicksort(int left, int right) { int i, j, t, temp; if (left > right) // 结束递归的条件 { return; } temp = a[left]; i = left; j = right; while (i != j) { while (a[j] >= temp && j > i) { j--; }; while (a[i] <= temp && i < j) { i++; } if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } } a[left] = a[i]; a[i] = temp; quicksort(left, i - 1); // 处理基准数左边的 quicksort(i + 1, right); // 处理基准数右边的 return; } int main() { int i; scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%d", &a[i]); } quicksort(1, n); for (i = 1; i <= n; i++) { printf("%d ", a[i]); } return 0; }