优化的快速排序

来源:互联网 发布:phpmyadmin for mac 编辑:程序博客网 时间:2024/05/18 00:03
//快速排序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]);elsebreak;}//退出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);}

0 0
原创粉丝点击