排序--之快速排序
当需要排序的元素较多时,排序时间很长,快速排序算法优势很明显。该算法的实现步骤:
首先:在数组中选一个基准数(通常为数组第一个);
接着:将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;
然后:对于基准数左、右两边的数组,不断重复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