快速排序的思想就是选择一个基准数,让每个数与它比较,找到它在所有这些数排好序后应该在的位置。
而快速排序对大体应经排好序的数执行效率是n^2,所以对基准数随机化,以下代码
#include <iostream>
#include <cstdlib>
using namespace std;
//产生m到n的随机数
int Random(int m, int n)
{
int pos, dis;
if(m == n)
{
return m;
}
else if(m > n)
{
pos = n;
dis = m - n + 1;
return rand() % dis + pos;
}
else
{
pos = m;
dis = n - m + 1;
return rand() % dis + pos;
}
}
void randomizedPartition(int *a,int left, int right)
{
int i = Random(left,right);
int temp = a[i];
a[left] = a[i];
a[i] = temp;
}
//该快速排序由于是默认以数组第一个数作为基准数,存在很大偶然性
//最好情况nlogn,最坏情况n^2
void quickSort(int *p,int left,int right)
{
if(left < right)
{
randomizedPartition(p,left,right); //让基准数是数组中的一个随机位置的数
int cut = p[left]; //以第一个数为基准数,将该基准数放在切确的位置以至于把整个数组分割成两半
int i = left;
int j = right;
while(i < j)
{
while(i < j && p[j] > cut) //从右往左,作比较
{
j--;
}
if(i < j)
{
p[i++] = p[j]; //这里算编程中技巧,用i那个位置存储一下j的数,而i的数已经保存在临时变量cur。或者另一种选择就是把i,j都找到再做交换
}
while(i < j && p[i] < cut) //从左往右,做比较
{
i++;
}
if(i < j)
{
p[j--] = p[i];
}
}
p[i] = cut; //i就是cur这个基准数的确切位置
quickSort(p,left,i-1);
quickSort(p,i+1,right);
}
}
int main()
{
int a[10] = {2,5,8,4,6,8,25,1,3,5};
quickSort(a,0,10-1);
for(int i = 0; i<10; i++)
cout<<a[i]<<" ";
}