• 【数据结构】——快速排序


      快速排序思想:

      快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。——百度百科;

      通俗一点就是:

        ①:如果数据是链式的,就声明两个指针low high分别指向链表的首尾,如果数据是数组形式,就声明两个值low high分别表示数组的首尾下标。

        ②:若low所指向的值小于等于high指向的值,则high做自减,如果low指向的值大于high指向的值,则交换low指向的值和high指向的值;

        ③:若low所指向的值小于等于high指向的值,则low做自加【和步骤二不同】,如果low指向的值大于high指向的值,则交换low指向的值和high指向的值;

        ④:若low 小于 high 则循环步骤二和步骤三;

        ⑤:做完以上步骤表示第一次排序成功,然后分割数组,重新对low和high赋值,重复步骤二到步骤四【是个递归过程】。

        

        附上代码:

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 
     5 void show_arry(int *arry)
     6 {
     7     int i = 0;
     8     int *tmp;
     9     tmp = arry;
    10     for( ; i < 8; i++)
    11         printf("%d ",*tmp++);
    12 
    13     putchar('
    ');
    14 }
    15 
    16 void change_val(int *a, int *b)
    17 {
    18     int tmp;
    19     tmp = *a;
    20     *a = *b;
    21     *b = tmp;
    22 }
    23 
    24 void sort(int *arry, int low, int high)
    25 {
    26     int *tmp;
    27     int val;
    28     int i = low, j = high;
    29     if(low >= high)
    30         return;
    31     tmp = arry;
    32     while(low < high){
    33         while(low < high && tmp[low] <= tmp[high]){
    34             high--;
    35         }
    36         change_val(&tmp[low], &tmp[high]);
    37 
    38         while(low < high && tmp[low] <= tmp[high])
    39             low++;
    40         change_val(&tmp[low], &tmp[high]);
    41     }
    42 
    43     sort(arry, i, low - 1);    //now low = high;you can use high too;
    44 
    45     sort(arry, low + 1, j);    
    46 }
    47 
    48 int main(int argc, char *argv[])
    49 {
    50     int arry[8] = {49,38,65,97,76,13,27,49};
    51     int low,high;
    52     
    53     low = 0;
    54     high = 7;
    55     show_arry(arry);
    56     sort(arry,low,high);
    57     show_arry(arry);    
    58 
    59     return 0;
    60 }

      有些代码喜欢定义一个关键字来进行对数组的首尾数据的比较,有助于代码的可读性。笔者写的程序中没有设计到关键字,主要是循环比较tmp[low] 和 tmp[high]只不过一个是low做自加,一个结果是high做自减,效果和使用关键字是相同的!

      修改一下sort的代码,改成使用关键字的方式:

     1 void sort2(int *arry, int low, int high)
     2 {
     3     int *tmp;
     4     int val;
     5     int i = low, j = high;
     6     int key = arry[low];    
     7 
     8     if(low >= high)
     9         return;
    10     tmp = arry;
    11     while(low < high){
    12         while(low < high && tmp[high] >= key)
    13             high--;
    14         tmp[low] = tmp[high];
    15 
    16         while(low < high && tmp[low] <= key)
    17             low++;
    18         tmp[high] = tmp[low];
    19     }
    20 
    21     tmp[low] = key;
    22 
    23     sort2(arry, i, low - 1);    //now low = high;you can use high too;
    24 
    25     sort2(arry, low + 1, j);    
    26 }

      可以发现用了关键字,则多付出一个int空间,但是减少了对change_val函数的调用,减少了系统的开销。

  • 相关阅读:
    MySQL 函数
    ARC072_F Dam
    1373D
    科目二和科目三找准30厘米位置的点位
    MySQL 数字保留两位小数
    IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
    MySQL SQL语句书写顺序和执行顺序
    科目三道路驾驶技能考试之百米加减挡操作
    上海科目三道路驾驶技能考试夜间灯光模拟操作
    上海 科目三大路考试攻略
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/3402179.html
Copyright © 2020-2023  润新知