您的位置:首页 > 其它

再次学习快速排序——优化

2018-03-27 23:14 204 查看
今天,我学习了一些优化快速排序的方法。

附上代码:

(优化前的代码为被注释掉的代码,优化后的代码我也用中文注释加以说明了)

#include <stdio.h>
void swap(int *a, int *b);

void QuickSort(int *a, int low, int high)
{
//if(low < high)
while(low < high)   //优化:"尾递归",减少递归深度
{
int pivot = Partition(a, low, high);
QuickSort(a, low, pivot-1);
//QuickSort(a, pivot+1, high);
low = pivot+1;  //优化:"尾递归",减少递归深度
}
}

int Partition(int *a, int low, int high)
{
int mid = low + (high-low)/2;   //*****
if(a[low] > a[high])
swap(&a[low], &a[high]);
if(a[mid] > a[high])            //优化:"三数取中",平衡递归树
swap(&a[mid], &a[high]);
if(a[low] < a[mid])
swap(&a[low], &a[mid]);     //*****

int pivotkey = a[low];
while(low < high)
{
while(low < high && a[high] >= pivotkey)
high--;
//swap(&a[low], &a[high]);
a[low] = a[high];   //优化:减少不必要的交换
while(low < high && a[low] <= pivotkey)
low++;
//swap(&a[low], &a[high]);
a[high] = a[low];   //优化:减少不必要的交换
}
a[low] = pivotkey;
return low;
}

int main()
{
int i;
int a[10] = {7, 3, 5, 8, 0, 4, 9, 1, 6, 2};
for(i = 0; i <10; i++)
printf("%d ", a[i]);
printf("\n");
QuickSort(a, 0, 9);
for(i = 0; i <10; i++)
printf("%d ", a[i]);
printf("\n");

return 0;
}

void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: