zoukankan      html  css  js  c++  java
  • 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
    ", sum);
    39     return 0;
    40 }

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

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

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

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

  • 相关阅读:
    PTA天梯赛L2
    图论-最短路算法
    配置自己的sublime
    testNG常用用法总结
    testng.xml文件的配置
    阿里云服务器 ECS Jenkins 安装教程
    jenkins报错:Problem accessing /jenkins/. Reason: HTTP ERROR 404
    jenkins安装详细教程
    jenkins下载插件无插件显示+离线下载插件方法
    如何让junit的测试跑多次
  • 原文地址:https://www.cnblogs.com/wenbao/p/6947319.html
Copyright © 2011-2022 走看看