听说有十大排序算法,先学习一下快速排序和计数排序算法。
一:快速排序
快速排序主要就是每一个找到当前取出来的标尺的数的位置,然后把小于它的数放在左边(从小到大排),把大于它的数放在右边。然后利用递归分左右继续找位置放数字,这个过程有点类似之前的根据前序和中序找后序的题目。递归的出口就是当只有一个数的时候就不需要排了。取出来的位置就是他的位置。
代码:
找每一次的位置:
int findpos(int l,int r){ int temp = data[l]; int i = l, j = r; while (i != j){ while (data[j] >= temp&&i < j)j--; data[i] = data[j]; while (data[i] <= temp&&i < j)i++; data[j] = data[i]; } data[i] = temp; return i; }
递归分区域找位置:
void quicksort(int l,int r){ if (l >= r) return; int pos = findpos(l, r); quicksort(l,pos-1); quicksort(pos+1,r); }
需要注意的有很多:
1.递归的出口要放在quicksort的最上面,不放在上面的话如果只有一个数还去找他的位置的话可能会陷入死循环。
2.while(i!=j)中的这个对称的while语句的写法可以注意背一下。
while (data[j] >= temp&&i < j)j--; data[i] = data[j]; while (data[i] <= temp&&i < j)i++; data[j] = data[i];
二:计数排序
计数排序不用经过比较,在读一遍的过程中用一个数组记录当前数组出现的次数,(其实就是把排序的过程用count数组的下标来实现了)。要注意的是每一次循环变量的取值:
第一次循环的时候是对于count清零,这时候循环变量应该等于count的下标个数,也就是要排序的数组的范围;(数组元素的下标要大于需要排序的数的范围)
第二次循环的时候是统计的时候,循环变量和要排序的数组的元素的个数相同;
第三次循环的时候是对于count数组的操作,累加得出当前元素应该放在排序好的数组中的位置。也就是有多少个数小于他,循环变量应该和count的长度相符合;
第四次循环是对于排序结果的赋值,循环变量和要排序的数组的个数相同即可。
代码:
int count[1001]; int Ans[10]; void countsort(){ for (int i = 0; i < 1000; i++){ count[i] = 0; } for (int i = 0; i < 10; i++){ count[data[i]]++; } for (int i = 1; i < 1000; i++){ count[i] = count[i] + count[i - 1]; } for (int i = 0; i < 10; i++){ Ans[--count[data[i]]] = data[i]; } }
完整测试代码:
#include <stdio.h> int data[10] = { 2, 3, 1, 5, 7, 6, 4, 8, 2, 0 }; int findpos(int l,int r){ int temp = data[l]; int i = l, j = r; while (i != j){ while (data[j] >= temp&&i < j)j--; data[i] = data[j]; while (data[i] <= temp&&i < j)i++; data[j] = data[i]; } data[i] = temp; return i; } void quicksort(int l,int r){ if (l >= r) return; int pos = findpos(l, r); quicksort(l,pos-1); quicksort(pos+1,r); } int count[1001]; int Ans[10]; void countsort(){ for (int i = 0; i < 1000; i++){ count[i] = 0; } for (int i = 0; i < 10; i++){ count[data[i]]++; } for (int i = 1; i < 1000; i++){ count[i] = count[i] + count[i - 1]; } for (int i = 0; i < 10; i++){ Ans[--count[data[i]]] = data[i]; } } int main(){ countsort(); return 0; }
时间: 2024-10-17 15:02:41