您的位置:首页 > 其它

排序-快速排序

2016-04-11 17:34 344 查看
快速排序

单线程最快的排序,每次排序使得序列基本有序,最后使得序列有序

说多了没用,直接看代码

#include <stdio.h>
//三数取中,为了提高效率可以多数取中
void ThreeToOne(int* L, int low, int high)
{
int middle = low + (high - low) / 2;
if (L[low] > L[high])
{
swap(L, low, high);
}
if (L[middle] > L[high])
{
swap(L, high, middle);
}
if (L[middle] > L[low])
{
swap(L, middle, low);
}
}

int Partition(int* L, int low, int high)
{
//3数取中间的数
ThreeToOne(L, low, high);
int pivotkey = L[low];//初始化枢轴为第一个元素
int temp = L[0];
while (low < high)
{
//比pivotkey大的数放在右边
while (low < high && L[high] >= pivotkey)
{
high--;
}
//myswap(L, low, high);
L[low] = L[high];

//比pivotkey小的数放在左边
while (low < high && L[low] <= pivotkey)
{
low++;
}
//myswap(L, low, high);
L[high] = L[low];
}
L[low] = temp;
return low;
}

//普通数组的插入排序
void InsertSort(int* L, int length)
{
int i;
int j;
int min_index;
int temp = 0;
for (i = 1; i < length; i++)
{
if (L[i] < L[i - 1])
{
temp = L[i];
for (j = i - 1; L[j] > temp; j--)
{
L[j + 1] = L[j];
}
L[j + 1] = temp;
}
}
}

//尾递归的快速排序效率较高
void QSort_Weidigui(int* L, int low, int high)
{
int pivot;
//排序个数较多采用快速排序
//MAX_LENGTH_INSERT_SORT 排序数量
if ((high - low) > MAX_LENGTH_INSERT_SORT)
{
while (low < high)
{
pivot = Partition(L, low, high);
QSort_Weidigui(L, low, pivot - 1);//枢轴左序列排序  下一次的递归 high = pivot - 1
low = pivot + 1;
}
}
else
{
//较少的排序元素采用插入排序
InsertSort(L, high);
}
}

//快速排序
void QuickSort(int* L, int length)
{
QSort_Weidigui(L, 0, length - 1);//数组最后一个元素不存在
}


main测试

int main(void)
{
int x[10] = { 50, 10, 90, 30, 70, 40, 80, 60, 20, 100 };
showArray(x, 10);

QuickSort(x, 10);//start sort

printf("\n");
showArray(x, 10);

system("pause");
return 0;
}


欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: