快速排序
快速排序:
描述:一趟排序将数据分割成两个部分,左半部分和右半部分,其中右半部分的数一定比左半部分的数来的
更大,然后在对这两个部分分别继续这个排序过程(可通过递归进行),以此达到整个序列都为有序序列
时间复杂度:O(n*log n)
方法:(主要采用二分思想)
1.设置两变量i,j;排序开始时:i=1,j=n.
2.将数组的第一个值做为比较值,保存在temp中,即temp=a[1].
3.然后向前搜索(j--),找到小于temp的值后,因为a[i(1)]的值保存在temp中,所以直接赋值:a[i]=a[j]
4.然后向后搜索(i++),找到大于temp的值后,因为a[j]的值保存在第3步的a[i]中,所以直接赋值,a[j]=a[i]
然后j--,避免死循环
5.重复3,4步,直到i=j,最后将temp值返回s[i]中
6.然后采用二分思想,以i为界限,拆分成两个数组a[1,i],a[i+1,n]继续排序
代码实现1:(和上述原理一样,但是时间有些慢....):
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAX_N=1e5+5; 4 int n; 5 int a[MAX_N]; 6 void sort(int l,int r) { 7 int i=l,j=r,tmp; 8 tmp=a[i]; 9 if (l>=r) return; 10 while (i<j) { 11 while (j>i&&a[j]>=tmp) j--; 12 a[i]=a[j]; 13 while (i<j&&a[i]<=tmp) i++; 14 a[j--]=a[i]; 15 } 16 a[i]=tmp; 17 sort(l,i-1); 18 sort(i+1,r); 19 } 20 int main() { 21 scanf("%d",&n); 22 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 23 sort(1,n); 24 for (int i=1;i<=n;i++) printf("%d ",a[i]); 25 }
代码实现2:(与sort函数的时间基本相同) :
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAX_N=1e5+5; 4 int n; 5 int a[MAX_N]; 6 void sort(int l,int r) { 7 int mid=a[(l+r)/2]; 8 int i=l,j=r; 9 while (i<=j) { 10 while (a[i]<mid) i++; 11 while (a[j]>mid) j--; 12 if (i<=j) { 13 swap(a[i],a[j]); 14 i++; 15 j--; 16 } 17 } 18 //两个方向如果没有找到最后一位就继续缩小范围进行 19 if (l<j) sort(l,j); 20 if (i<r) sort(i,r); 21 } 22 int main() { 23 scanf("%d",&n); 24 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 25 sort(1,n); 26 for (int i=1;i<=n;i++) printf("%d ",a[i]); 27 }