#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循环来做,会简单点。。留给大家自己做吧。。