快速排序改进算法
2014-09-13 23:35
281 查看
#include<iostream> using namespace std; const int M = 20; void quickSort(int *data,const int left,const int right); int partition(int *data,const int low,const int high); void insertSort(int *data,const int left,const int right); void swap(int &a,int &b); int main() { int size = 0; cin >> size; if (size > 100 || size < 1) return 0; int *data = new int[size]; for (int i = 0; i < size; ++i) cin >> data[i]; quickSort(data,0,size-1); for (int i = 0; i < size; ++i) cout << data[i] << " "; return 0; } void quickSort(int *data, const int left, const int right) { if (right - left < M) insertSort(data,left,right); //if (right <= left) //return; else { int pivotPos = partition(data,left,right); quickSort(data,left,pivotPos-1); quickSort(data,pivotPos+1,right); } } int partition(int *data, const int low, const int high) { int pivotPos = low; int pivotValue = data[low]; for (int i = low+1; i <= high; ++i) { if (pivotPos == i) continue; if (pivotValue > data[i]) { swap(data[++pivotPos], data[i]); } } data[low] = data[pivotPos]; data[pivotPos] = pivotValue; return pivotPos; } void swap(int &a, int &b) { int temp = a; a = b; b = temp; } void insertSort(int *data, const int left, const int right) { int current = 0; for (int i = left+1; i <= right; ++i) { current = data[i]; int j; for (j = i-1; j >=left; --j) { if (current < data[j]) { data[j + 1] = data[j]; } else { break; } } data[j+1] = current; } }
对于长度比较小的序列,快排并不比简单的排序算法快,因此加了一个插入排序(当序列长度小于20时用插入排序)。
研究表明,序列长度取值为5——25时,采用直接插入排序要比快排至少快10%。
相关文章推荐
- 快速排序的改进算法
- 快速排序的两种改进方法算法及topK问题求解
- 算法记录:二进制快速排序
- 插入排序,合并排序,堆排序,快速排序,计数排序的实现(算法导论)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 经典算法之快速排序
- 【快速排序】算法实现
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- java基础知识之 算法 【冒泡排序】【快速排序】
- 快速排序改进
- 常用算法总结之排序(三)----改进冒泡
- [每周一算法]快速排序
- C#算法-------(四)快速排序
- 【经典算法】快速排序
- 快速排序与快速选择算法(quick sort and quick select algorithm)
- C#算法-------(五)快速排序
- 算法与数据结构——快速排序 Quick Sort
- c#与算法--快速排序
- 算法复习:快速排序
- 读书笔记 算法导论 快速排序 QuickSort 使用最后一个元素作为pivot