zoukankan      html  css  js  c++  java
  • 排序--之快速排序

    当需要排序的元素较多时,排序时间很长,快速排序算法优势很明显。该算法的实现步骤:

    首先:在数组中选一个基准数(通常为数组第一个);

     接着:将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;

    然后:对于基准数左、右两边的数组,不断重复1和2过程,直到每个子集只有一个元素,即为全部有序。

    例如有一需要排序的数组为:23,45,17,11,13,89,72,26,3,17,11,13(从小到大排序):

    具体代码实现:

    1、选取数组第一个数23为基准数,存入temp变量中;

    2、定义两个指针 left和right,从数组的左右两边界向中间进行遍历,left最开始指向数组的第一个元素,right最开始指向数组的最后一个元素。指针left从左向右移动,指针right 从右向左移动。

    3、先移动right指针(自右向左移,值逐渐减小),当right指向的数大于基准数时(应该在基数的右边),略过(不操作),right继续往左(数值减小1)移动,直到遇到小于等于基准数的数arr[right],将arr[j]填入arr[i]中;

    4、再移动left指针,当left 指向的数小于等于基准数时,略过,left 继续往右移动,直到遇到不比基准数小的数arr[left],将arr[left]填入arr[left]中;再移动left指针,

    5、再移动right指针...(轮换移动),直到left 和right指针相遇,最后将temp(基准数)填入arr[left]中即完成算法的第2个步骤。

    6、接下来分别将基准数左边和右边的数组按照以1-5步骤进行聚合,直到每个子集只有一个元素,即排序完成。下图一步一步的示意:

    借用:https://blog.csdn.net/elma_tww/article/details/86164674中的图,谢谢原作者。

    将数组第一个数23赋给temp变量,指针 i 指向数组第一个元素,指针 j 指向数组最后一个元素

    从 j 开始遍历(从右往左),遇到13时,因为13<=temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为13;

    再从 i 遍历(从左往右),遇到45时,因为45>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为45;

    继续从 j 遍历,遇到11时,因为11<=temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为11;

    从 i 遍历,遇到89时,因为89>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为89;

    从 j 遍历,遇到17时,因为17<=temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为17;

    从 i 遍历,遇到72时,因为72>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为72;

    从 j 遍历,遇到3时,因为3<=temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为3;

    从 i 遍历,遇到26时,因为26>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为26;

    从 j 遍历,和 i 重合;

    将 temp(基准数23)填入arr[i]中。

    此时完成算法的第2个步骤,接下来将23左边和右边的子区间分别用以上方法进行排序,直到区间只有一个元素即排序完成。

    代码make:

     1 testSort:testSort.c quickSort.c ../sortG.c                                              
     2     gcc -g $^ -o $@
     3 PHONY:clean
     4     rm $@

    代码quickSort.h:

     1 #ifndef quickSort_h
     2 #define quickSort_h
     3 
     4 #include <stdio.h>
     5 #include <stdlib.h>
     6 
     7 #include "../sortG.h"
     8 
     9 void quickSort(int *arr, int begin, int end);                                           
    10 
    11 #endif

    代码quickSort.c:

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/sort/quick/quickSort.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年12月02日的上午09:06
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第48周 12月02日 星期三 上午09:06 (第337天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 void quickSort(int *arr, int begin, int end){
    13     if(begin < end){
    14         int tmp = *(arr + begin);
    15         int left = begin;
    16         int right = end;
    17         while(left < right){
    18             while(left < right && *(arr + right) > tmp){
    19                 right--;
    20             }
    21             *(arr + left) = *(arr + right);
    22             while(left < right && *(arr + left) <= tmp){
    23                 left++;
    24             }
    25             *(arr + right) = *(arr + left);
    26         }
    27         *(arr + left) = tmp;
    28 
    29         quickSort(arr, begin, left - 1);
    30         quickSort(arr, right + 1, end);
    31     }else{
    32         return;                                                                         
    33     }
    34 
    35     return;
    36 }

    代码testSort.c:

     1 //This is c program code!
     2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
     3   * 文档信息: *** :~/testSort.c
     4   * 版权声明: *** :(魎魍魅魑)MIT
     5   * 联络信箱: *** :guochaoxxl@163.com
     6   * 创建时间: *** :2020年11月30日的上午11:12
     7   * 文档用途: *** :数据结构与算法分析-c语言描述
     8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
     9   * 修订时间: *** :2020年第48周 11月30日 星期一 上午11:12 (第335天)
    10   * 文件描述: *** :自行添加
    11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
    12 //#include "bubbleSort.h" 
    13 #include "quickSort.h"                                                                  
    14 
    15 int main(int argc, char **argv)
    16 {
    17     NArr *nArr = createArr();
    18     dispArr((nArr->arr), nArr->size);
    19     quickSort(nArr->arr, 0, nArr->size - 1);
    20     dispArr((nArr->arr), nArr->size);
    21 
    22     return 0;
    23 }

    代码sortG.c:

     1 #include "sortG.h"
     2 
     3 NArr *createArr(){
     4     NArr *nArr = (NArr *)malloc(sizeof(NArr));
     5     //int nArr->size;
     6     printf("Enter the number of items in the list, size(2 <= size <= 20): ");
     7     scanf("%d", &(nArr->size));
     8     nArr->arr = (int *)malloc(sizeof(int) * nArr->size);                                
     9     printf("Enter the %d integers I ( 0 <= I <= 300): ", nArr->size);
    10     printf("separated by white space: 
    ");
    11     for(int i = 0; i < nArr->size; i++){
    12         scanf("%d", nArr->arr + i);
    13     }
    14 
    15     return nArr;
    16 }
    17 
    18 void dispArr(int *arr, int size){
    19     for(int i = 0; i < size; i++){
    20         printf("%d	", *(arr + i));
    21     }
    22     printf("
    ");
    23 
    24     return;
    25 }
    26 
    27 void swap(int *var1, int *var2){
    28     int tmp = 0;
    29     tmp = *var1;
    30     *var1 = *var2;
    31     *var2 = tmp;
    32 
    33     return;
    34 }

    测试结果:

    testSort 
    Enter the number of items in the list, size(2 <= size <= 20): 12
    Enter the 12 integers I ( 0 <= I <= 300): separated by white space: 
    23
    45
    17
    11
    15
    89
    72
    26
    3
    19
    10
    13
    23      45      17      11      15      89      72      26      3       19      10      13
    3       10      11      13      15      17      19      23      26      45      72      89
  • 相关阅读:
    qml-qt项目利用google 分析进行数据统计分析
    mark 一下
    一篇神文
    android webview web里面的数据透传到java以及java的数据透传到web
    数据库表大小排序
    sql 删除数据库所有用户表
    mssql 修改文件逻辑名称
    灰色滤镜,网页灰色代码
    log4net.config 单独文件
    js获取页面宽度高度及屏幕分辨率
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/14084496.html
Copyright © 2011-2022 走看看