排序--之快速排序

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

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

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

然后:对于基准数左、右两边的数组,不断重复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: \n");
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\t", *(arr + i));
21     }
22     printf("\n");
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

 

posted @ 2020-12-04 10:41  叕叒双又  阅读(129)  评论(0编辑  收藏  举报