#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void swap(int& big, int& small)
{
int temp = big;
big = small;
small = temp;
}
int partition(int data[],int left,int right)
{
int base=data[right]; //以最后一个元素,data[right]为参照物
int i=left-1;
/*
|这里运用的是观察者模式,i是一个旁观者
|
|游标j从左至右迭代,当if语句只判断data[j]<base情况
|也就是说data[j]>base时的时候只是执行外层for循环,并移动游标j
|
|若序列开始部分的若干数据小于base时,就不执行i和j的值swap()交换。
|
|当arr[j]>base时,执行外层for循环。此时区间[0 : i]的取值都是小于base的
|且区间[i:j]的值都是大于base的。记着 @_1
|
|当再次出现arr[j]<base时。i += 1 ,由上述@_1得知此时的arr[i]>arr[j],执行交换
|继续for循环
|
|当j == right时,for 循环结束。此时我们知道:区间[0 : i]的取值
|都是要小于区间[i : j]的取值的。记着 @_2
|
|现在由于j迭代到right时已经退出循环,此时没有进行arr[j]和base的比较
|也就是没有进行base和arr[i]的比较。
|但我们知道区间[i+1 : j-1]的取值都是大于base的 记着@_3
*/
for(int j = left; j < right; j++)
{
if( data[j] <= base)
{
i += 1;
if (data[i] != data[j]) //毕竟比较两个数的大小要比复制数据在效率上更高
swap(data[i],data[j]); //显然,不论怎样,小数值总是要放在左边的
}
}
/*
|由@_3得知,区间[i+1 : j-1]都是大于base的
|这里执行一次优化,既然arr[i+1]>base
|那么就交换arr[i+1]和base的取值。
|此时的序列中,区间[0 : i]都是小于区间[i : j]的
|但以i为分隔的前后序列都还不是有序的,所以传回分解符的位置到quicksort
|继续递归迭代。
*/
swap(data[i+1],data[right]);
return i+1;
}
void quickSort(int data[], int left, int right)
{
if (left < right)
{
int index = partition(data, left, right);
quickSort(data, left, index - 1);
quickSort(data, index + 1, right);
}
}
void main()
{
srand(unsigned int(time(NULL)));
const int size = 100;
const int size_seed = 100;
int iarray[size];
for ( int i = 0; i <= size; i++ )
iarray[i] = (rand()%size_seed+ 1);
// clock_t begin = clock();
quickSort(iarray, 0, size);
// clock_t end = clock();
// double result = difftime(end, begin);
for (int j =0; j <= size; j++ )
cout << iarray[j] << " ";
/*清空内存缓冲区的数据,因为此时数据已经写入到显存中*/
// cout<<"quick sort cost " << result/CLOCKS_PER_SEC << "seconds" << endl;
cout.flush();
cin.get();
}
快速排序(优化版)
最新推荐文章于 2022-09-13 19:35:26 发布