zoukankan      html  css  js  c++  java
  • 排序问题

    (1)插入排序

     1 void insertSort(int arr[], int n){
     2     int i,j,t;
     3 
     4     for(i=1; i<n; i++){
     5         t = arr[i];
     6         for(j=i-1; arr[j]>t && j>=0; j--){
     7             arr[j+1] = arr[j];
     8         }
     9         arr[j+1] = t;
    10     }
    11 }

    (2)简单的快速排序

     1 void q_sort(int arr[], int sp, int ep){
     2     int m, i, t;
     3 
     4     if(sp >= ep)
     5         return;
     6     else{
     7         m = sp;
     8         for(i=sp+1; i<=ep; i++){
     9             if(arr[i] < arr[sp]){
    10                 m++;
    11                 t = arr[m];
    12                 arr[m] = arr[i];
    13                 arr[i] = t;
    14             }
    15         }
    16 
    17         t = arr[sp];
    18         arr[sp] = arr[m];
    19         arr[m] = t;
    20 
    21         q_sort(arr, sp, m-1);
    22         q_sort(arr, m+1, ep);
    23     }
    24 }

    原理:利用分治的思想,将数组排序范围最左端的元素作为参照,将比其小的元素移到其左边,将比其大的元素移动到其右边,在分别对两边的进行递归排序即可。


    (3)更好的几种快速排序

    1、双向划分

     1 void q_sort2(int arr[], int sp, int ep){
     2     int i, j, t;
     3     if(sp >= ep)
     4         return;
     5     else{
     6         i = sp;
     7         j = ep + 1;
     8         while(1){
     9             do{i++;} while(i<=ep && arr[i]<arr[sp]);
    10             do{j--;} while(j>=sp && arr[j]>arr[sp]);
    11 
    12             if(i>j) break;
    13             else{
    14                 t = arr[i];
    15                 arr[i] = arr[j];
    16                 arr[j] = t;
    17             }
    18         }
    19         
    20         t = arr[sp];
    21         arr[sp] = arr[j];
    22         arr[j] = t;
    23 
    24         q_sort2(arr, sp, j-1);
    25         q_sort2(arr, j+1, ep);
    26     }
    27 }

    2、随机选取参照元素

    将sp出的元素与[sp, ep]中随机的某个元素进行交换,再以sp处的元素作为参照进行分割排序,可以使得最差复杂度也趋近于O(nlogn)

  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/lwyeah/p/8586475.html
Copyright © 2011-2022 走看看