快速排序(优化版)

#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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值