借助比较的排序每次比较贡献O(1)的复杂度
插入排序 最少n-1 最多n(n-1)/2
冒泡排序 最少n-1 最多n(n-1)/2
选择排序 n(n-1)/2
- int partition(int *arr , int low , int high)
- {
- int pivo = arr[low];
- while(low < high)
- {
- while(low < high && arr[high] >= pivo)
- –high;
- arr[low] = arr[high];
- while(low < high && arr[low] <= pivo)
- ++low;
- arr[high] = arr[low];
- }
- arr[low] = pivo;
- return low;
- }
- // 快速排序 递归
- void qsort(int *arr , int low , int high)
- {
- if(low < high)
- {
- int pivo = partition(arr , low , high);
- qsort(arr , low , pivo-1);
- qsort(arr , pivo+1 , high);
- }
- }
分析:在递归部分由于递归深度可为logn — n,故递归部分的比较次数为logn — n,partition部分的比较次数与数据分布有关,大约为n次,还需进一步分析。。。
总共比较次数nlogn — n^2
希尔排序 ??
归并排序 在每一次二路归并的过程中,对于N个元素:当一个数组的最小元素比另一数组的最大元素还大时;若两个数组元素交替增长,比较次数最多,为2N-1
再加上递归深度logN,故比较次数为 NlogN — (2N-1)logN
堆排序 ??