zoukankan      html  css  js  c++  java
  • C++实现希尔排序和快排

    • 希尔排序
      • 时间复杂度O(n^3/2)
      • 用三个循环实现:
        • 1 分多少次组
        • 2 每次分组分多少组
        • 3 组内插入排序
      • 希尔排序利用了插入排序的两个特点:
        • 1 数据越少,效率越高
        • 2 数据越有序,效率越高

    • 快排
      • 时间复杂度O(nlogn)
     1 #include <stdio.h>
     2 
     3 #define DATA_ARRAY_LENGTH       12
     4 
     5 // 
     6 int shell_sort(int *data, int length) {
     7 
     8     int gap = 0; //分组的跨度
     9     int i = 0, j = 0;
    10 
    11     for (gap = length / 2; gap >= 1;gap /= 2) { // 分组的次数
    12 
    13         for(i = gap; i < length; i ++) { // 每组遍历 
    14 
    15             int temp = data[i];
    16             for (j = i - gap; j >= 0 && temp < data[j];j = j - gap) { //组内排序
    17 
    18                 data[j+gap] = data[j];
    19 
    20             }
    21 
    22             data[j+gap] = temp;
    23         }
    24 
    25     }
    26     return 0;
    27 }
    28 
    29 // 
    30 int sort(int *data, int left, int right) { //每一次递归, 每调用一次, 确定一个值得正确位置
    31 
    32     if (left >= right) return 0;
    33 
    34     int i = left;
    35     int j = right;
    36     int key = data[left];
    37 
    38     while (i < j) { //
    39 
    40         while (i < j && key < data[j]) { // 
    41             j --;
    42         }
    43         data[i] = data[j];
    44 
    45         while (i < j && key >= data[i]) {
    46             i ++;
    47         }
    48         data[j] = data[i];
    49     }
    50     // i == j
    51     data[i] = key;
    52 
    53     //
    54     sort(data, left, i-1);
    55     sort(data, i+1, right);
    56 
    57 }
    58 
    59 
    60 int quick_sort(int *data, int length) { //
    61 
    62     sort(data, 0, length-1);
    63 
    64 
    65 }
    66 
    67 
    68 int main() {
    69 
    70     int i = 0;
    71     int data[DATA_ARRAY_LENGTH] = {23, 64, 24, 12, 9, 16, 53, 57, 71, 79, 87, 97};
    72 #if 0
    73     shell_sort(data, DATA_ARRAY_LENGTH);
    74 #else
    75 
    76     quick_sort(data, DATA_ARRAY_LENGTH);
    77 
    78 #endif 
    79 
    80 
    81     for (i = 0;i < DATA_ARRAY_LENGTH;i ++) {
    82         printf("%4d", data[i]);
    83     }
    84     printf("
    ");
    85 }
    _graph_vex
  • 相关阅读:
    Diffbot:开发者工具 将web内容转换成应用
    算法之道—形而之上谓之道
    css三个ppt
    SMB的NTLM认证过程与NTLM挑战的编程实现
    c++计算圆周率
    SVN总结
    struts2技术实现用户名唯一的验证处理详解
    数字常量
    二叉树的创建和遍历
    php变量的定义和作用域
  • 原文地址:https://www.cnblogs.com/ZGreMount/p/15475390.html
Copyright © 2011-2022 走看看