快速排序

快速排序:
描述:一趟排序将数据分割成两个部分,左半部分和右半部分,其中右半部分的数一定比左半部分的数来的
更大,然后在对这两个部分分别继续这个排序过程(可通过递归进行),以此达到整个序列都为有序序列
时间复杂度: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 }  

 

posted @ 2021-08-07 14:33  jue1e0  阅读(47)  评论(0)    收藏  举报