快速排序
描述:
第二次写快速排序,今年暑假写过一次,当时没有直接成功,昨晚心血来潮,突然想再打一次,结果被自己的粗心付出了惨痛的代价。
思想:
其实快排的思想还是蛮新奇的,以前只懂冒泡,交换等的我没发现快排效率还真高,时间复杂度O(nlogn),强。
其实就是先找出待排序数组里面的一个值,作为比较对象key,重右往左找到一个比key小的下标m,再从左往右找一个比key大的下标n,交换位置,记录下标,当n<m时,一直重复,当m==n时,将其与key值交换。
代码:
/*
耗费两个晚上,真是太笨了,小问题太粗心
*/
#include<bits/stdc++.h>
using namespace std;
#define N 50
int a[N];
void Quick_sort(int a[],int left,int right)
{
int key;
int temp;
key=a[left];
int m=left,n=right;
if(left>=right)
return;
while(m<n)
{
while(m<n&&a[n]>key)
n--;
while(m<n&&a[m]<=key) //开始没有加=,哎粗心
m++;
if(m<n)
{
temp=a[n];
a[n]=a[m];
a[m]=temp;
}
}
a[left]=a[n];
a[m]=key;
Quick_sort(a,left,m-1);
Quick_sort(a,m+1,right);
}
int main()
{
int n;
cout<<"输入待排序数目:";
cin>>n;
cout<<"输入数据:"<<endl;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
Quick_sort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}