wenbao与排序

 

快排

 

确定一个基数,从后往前找比他小的第一个,交换。再从左往右找地一个大于他的第一个,交换。。连续执行。。。。。。

引用百度百科:

  一趟快速排序的算法是:
  1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
  2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
  3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
  4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
  5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
 
 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 using namespace std;
 5 const int maxn = 10;
 6 int arr[maxn];
 7 void print(){
 8     for(int i = 0; i < maxn; i++) cout << arr[i]<<" ";
 9     cout << endl;
10 }
11 int part(int *arr, int lx, int rx){
12     int low = lx, high = rx;
13     int temp = arr[lx];    
14     while(low < high){
15         while(low < high && arr[high] >= temp) -- high;
16         arr[low] = arr[high];
17         while(low < high && temp >= arr[low]) ++ low;
18         arr[high] = arr[low];
19     }
20     arr[low] = temp;
21     cout<<"-------"<<endl;
22     print();
23     return low;
24 }
25 void quicksort(int *arr, int begin, int end){
26     if(begin < end){
27         int pos = part(arr, begin, end);
28         quicksort(arr, begin, pos-1);
29         quicksort(arr, pos+1, end);
30     }
31 }
32 int main(){
33     for(int i = 0; i < maxn; i ++){
34         //arr[i] = rand()%100;
35         cin >> arr[i];
36     }
37     quicksort(arr, 0, maxn-1);
38     print();
39     return 0;
40 }

 

 1 #include <iostream>
 2 using namespace std;
 3 const int maxn = 10;
 4 int arr[maxn];
 5 void print(){
 6     for(int i = 0; i < maxn; i++) cout << arr[i]<<" ";
 7     cout << endl;
 8 }
 9 void quicksort(int *arr, int begin, int end){
10     if(begin < end){
11         int low = begin, high = end;
12         int temp = arr[begin];    
13         while(low < high){
14             while(low < high && arr[high] >= temp) -- high;
15             arr[low] = arr[high];
16             while(low < high && temp >= arr[low]) ++ low;
17             arr[high] = arr[low];
18         }
19         arr[low] = temp;
20         cout<<"-------"<<endl;
21         print();
22         quicksort(arr, begin, low-1);
23         quicksort(arr, low+1, end);
24     }
25 }
26 int main(){
27     for(int i = 0; i < maxn; i ++){
28         cin >> arr[i];
29     }
30     quicksort(arr, 0, maxn-1);
31     print();
32     return 0;
33 }

 

 

------------------------------------------------------------------------

 

归并排序


利用递归加分治的思想逐步排序,可高效处理逆序对问题

 

 

 

 1 #include <iostream>
 2 using namespace std;
 3 const int maxn = 1e5+10;
 4 int n, a[maxn], L[maxn/2], R[maxn/2];
 5 long long sum = 0;
 6 void d(int A[], int l, int mid, int r){
 7     int i, j;
 8     for(i = l; i <= mid; ++i){
 9         L[i-l] = A[i];
10     }
11     for(j = mid+1; j <= r; ++j){
12         R[j-mid-1] = A[j];
13     }
14     L[i-l] = R[j-mid-1] = 1e9+10;
15     int num1 = 0, num2 = 0;
16     for(i = l; i <= r; ++i){
17         if(L[num1] <= R[num2]) A[i] = L[num1++];
18         else{
19             A[i] = R[num2++];
20             sum += mid-l-num1+1;
21         }
22     }
23 }
24 void solve(int A[], int l, int r){
25     if(l < r){
26         int mid = (l+r) >> 1;
27         solve(A, l, mid);
28         solve(A, mid+1, r);
29         d(A, l, mid, r);
30     }
31 }
32 int main(){
33     scanf("%d", &n);
34     for(int i = 0; i < n; ++i){
35         scanf("%d", &a[i]);
36     }
37     solve(a, 0, n-1);
38     printf("%lld\n", sum);
39     return 0;
40 }

 

------------------------------------------------------------------------

------------------------------------------------------------------------

------------------------------------------------------------------------

------------------------------------------------------------------------

 

posted @ 2018-04-14 13:52  wenbao  阅读(132)  评论(0编辑  收藏  举报