快速排序

#include<iostream>
using namespace std;

void swap(int* a,int* b)
{
	int temp=*a;
	*a=*b;
	*b=temp;
}

void quickSort(int a[],int first,int last)
{
	if(first<last)
	{
		
		int i=first+1,j=last;
		int temp=a[first];
		int current=first;
		bool change=true;
		while(change)
		{
			change=false;
			for(;j>current;)
			{
				if(a[j]<temp)
				{
					swap(&a[j],&a[current]);
					current=j--;
					change=true;
					break;
				}
				j--;
			}
			
			for(;i<current;)
			{
				if(a[i]>temp)
				{
					swap(&a[i],&a[current]);
					current=i++;
					change=true;
					break;
				}
				i++;
			}
			
		}
		quickSort(a,first,current-1);
		quickSort(a,current+1,last);
	}
}
void main()
{
	int a[]={3,6,4,6,2,9,5,3,6,8,0,2};
	int length=sizeof(a)/sizeof(int);
	quickSort(a,0,length-1);
	for(int i=0;i<length;i++)
	{
		cout<<a[i]<<" ";
	}
}

以上代码都是急性写的(包括以前算法),没优化过,感觉有点臃肿,目前只为简单实现。。肯定还有更简洁的代码,大家自己看着优化下。

我的思路:先设置一个变量:change,它记录了本次遍历是否产生了交换,如果没有,那么就结束了这轮的排序。

还有大家看那个j--估计会有点奇怪,为什么不在for的后面直接加上呢,而且还在if的判断中写了j--呢,那是因为break的原因,如果懂for的执行顺序的话,就懂这个原理了,如果我们在if中执行了break,那么j--就不会执行了,但是我们要求每次执行了依次for循环就要求j--,所以我就在两处都写了j--当然还有一种方法,那就是把j--放在for循环的第一行,在下面的语句中如果用到了j,就把它变成j-1就可以了。。对i也是这个解释。。

其实这里用while循环来做,会简单点。。留给大家自己做吧。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值