快速排序属于交换排序 采 用分治法比冒泡排序时间复杂度低了一点,
快速排序的思想是 每一轮挑选一个基准元素,并让剩下的比他大的元素移动到一边,比它小的元素移动到另一边,把数列拆成两个部分分而治之,在最终通过递归,使每个子序列只剩一个元素,这时候就是已经排好序的
双边循环法:
代码
#include <iostream>
using namespace std;
//双边循环法
int partition(int a[],int start,int end)
{
int pivot=a[start];
int left=start;
int right=end;
while(left!=right)
{
while(left<right&&a[right]>pivot)
right--;
while(left<right&&a[left]<=pivot)
left++;
if(left<right)
{
int temp=a[left];
a[left]=a[right];
a[right]=temp;
}
}
//将pivot移动到中间
a[start]=a[left];
a[left]=pivot;
return left;
}
void Quick_Sort(int a[],int start,int end)
{
//递归结束的条件 左边的下标等于右边的下标时
int pivot;// pivot基准元素
if(start>=end)
return ;
pivot=partition(a,start,end);
//根据基准元素分成两部分进行递归排序
Quick_Sort(a,start,pivot-1);
Quick_Sort(a,pivot+1,end);
}
int main()
{
int a[8]={4,7,6,5,3,2,8,1};
Quick_Sort(a,0,7);
for(int i=0;i<8;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
单边循环法
#include <iostream>
using namespace std;
//单边循环法
int partition(int a[],int start,int end)
{
int pivot=a[start];
int mark=start;
for(int i=start+1;i<=end;i++)
{
if(a[i]<pivot)//让小于基准元素的数据区增大
{
mark++;
int temp=a[mark];
a[mark]=a[i];
a[i]=temp;
}
}
//将pivot移动到中间
a[start]=a[mark];
a[mark]=pivot;
return mark;
}
void Quick_Sort(int a[],int start,int end)
{
//递归结束的条件 左边的下标等于右边的下标时
int pivot;// pivot基准元素
if(start>=end)
return ;
pivot=partition(a,start,end);
//根据基准元素分成两部分进行递归排序
Quick_Sort(a,start,pivot-1);
Quick_Sort(a,pivot+1,end);
}
int main()
{
int a[8]={4,7,6,5,3,2,8,1};
Quick_Sort(a,0,7);
for(int i=0;i<8;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
单边循环法相比,减少了一点繁琐。以上是运用递归的方法实现的,也有非递归的方法,是基于栈实现的,在这里我就不说了。