• 排序问题


    (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)

  • 相关阅读:
    VC++以及VS个版本比较 及 C++编译器比较
    这本书的封面
    json_encode(),json_deocde()用法说明
    循环匹配,一般用于多选列表选中状态
    js判断变量是否被定义
    js onload()事件调用方法
    js push使用方法
    iframe去掉边滚动条
    ajax上传文件(使用ajaxfileupload)
    基于url的权限控制
  • 原文地址:https://www.cnblogs.com/lwyeah/p/8586475.html
Copyright © 2020-2023  润新知