您的位置:首页 > 其它

快速排序改进算法

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%。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: