美文网首页
优化的快速排序

优化的快速排序

作者: __小二杰 | 来源:发表于2016-03-15 19:31 被阅读33次
//快速排序

void Swap(int &a, int &b)

{

 //a ^= b;

 //b ^= a;

 //a ^= b;

 int temp;

 temp = a;

 a= b;

 b = temp;

}

 

 

int Median3(int a[], int Left, int Right)

{

 int Center = (Left+Right)/2;

 

 //将左中右三个值排序

 if(a[Left] > a[Center])

 {

 Swap(a[Left], a[Center]);

 }

 

 if(a[Left] > a[Right])

 {

 Swap(a[Left], a[Right]);

 }

 if(a[Center] > a[Right])

 {

 Swap(a[Center], a[Right]);

 }

 //将中值放在倒数第二个位置并作为枢纽元返回

 Swap(a[Center], a[Right-1]);

 

 return a[Right-1];

}

 

void InsertionSort(int a[], int n)

{

 int temp ;

 for(int i = 1; i < n; ++i)

 {

 int j;

 temp = a[i];

 for(j = i; j >0 && temp < a[j-1]; --j) //a[j]前的序列都是排好序的,在找到那个比a[j]小的值前,遍历过的值都向后挪1位

 {

 a[j] = a[j-1];

 }

 a[j] = temp;

 }

}

 

void quickSort(int a[], int Left, int Right)

{

 int i, j, Pivot;

 if(Left +3 <= Right) //当元素个数较少时,使用插入排序比快速排序要快,

 {

 Pivot = Median3(a, Left, Right);

 /* int m = a[0];

 int n = a[7];*/

 i = Left;

 j = Right-1;

 for(;;) //找到a[i]大于枢纽元的位置和a[j]小于枢纽元的位置并交换两个位置,一直进行直到i大于j退出

 {

 while(a[++i] < Pivot) {}

 while(a[--j] > Pivot) {}

 if(i < j)

 Swap(a[i], a[j]);

 else

 break;

 }

 //退出for循环时,a[i]的值大于枢纽元并且位置在a[j]左边,故a[i]与枢纽元交换, 则此时枢纽元左边的都是较小值,右边都是较大值.

 Swap(a[i], a[Right-1]); 

 quickSort(a, Left, i-1);

 quickSort(a, i+1, Right);

 }

 else

 {

 InsertionSort(a+Left, Right-Left+1);

 }

}

 

void QuickSort(int a[], int n)

{

 quickSort(a, 0, n-1);

}

相关文章

网友评论

      本文标题:优化的快速排序

      本文链接:https://www.haomeiwen.com/subject/pzlqlttx.html