排序算法七——快速排序
来源:互联网 发布:js读取div内容 编辑:程序博客网 时间:2024/05/16 16:08
排序算法七:快速排序
快速排序的大致思想是:先随便选一个值,然后比这个值小的放在它左边,比它大的放在它右边。这样这组数字就被分成了两组, 然后再在左边那一组数字里面选一个值,比这个值大的放在它左边,比这个值大的放在它右边。就这样一直递归调用自己,到最后只剩一个值的时候,整组数都排好序了。
算法有两个函数,函数Quick_sort跟函数Partition, 函数Quick_sort主要用来递归调用自己,最主要的函数Partition是用来随机取键值,然后把一组数分成两组,再返回键值的位置。
下图是我画了一个多小时的图解:(自我感觉画的很清楚 )
画到后面就没画小框框了。
这个图是只画了第一次找键值位置的图解,下面每次找键值位置都跟这个一样,只不过一直都在递归调用。
快速排序代码:
File name:7quick_sort.c Author: Tang Zhiqian Date:2017-08-10 11:04*****************************************************///快速排序#include <stdio.h>#define MAX 10typedef int ElementType;typedef ElementType ARR[MAX];ARR arr = {6,9,1,7,5,8,3,0,4,2};void QuickSort(ARR arr,int low,int high);int Partition(ARR arr,int low,int high);void print(ARR arr);int main(){ QuickSort(arr,0,MAX - 1); print(arr); return 0;}void QuickSort(ARR arr,int low,int high){ int pivot; //轴枢的位置 if (low < high) { pivot = Partition(arr,low,high); QuickSort(arr,low,pivot - 1); //对低子表快速排序 QuickSort(arr,pivot + 1,high); //对高子表快速排序 }}int Partition(ARR arr,int low,int high){ int pivotkey; //枢轴的值 pivotkey = arr[low]; //我们枢轴取第一个值 while(low < high) { while(low < high && arr[high] >= pivotkey) //必须从high开始比,因为开始arr[low]等于pivot { high--; } //出了这个while说明 arr[high] 小于枢轴的值 arr[low] = arr[high]; //把high的值赋值给low while(low < high && arr[low] <= pivotkey) { low++; } //出了这个while说明arr[low] 大于枢轴的值,它在低位不能比枢轴数字大,所以要移动 arr[high] = arr[low]; //所以把此时low的值赋值给high。此时的high就是刚刚赋值给上一个low的位置 //迷糊的很啊 } arr[low] = pivotkey; //当low跟high一样的时候,跳出大的while循环,然后把枢轴的值放进去 print(arr); return low; //返回枢轴的位置}void print(ARR arr){ int i; for (i = 0; i < MAX; i++) { printf("%d ",arr[i]); } printf("\n");}
程序运行结果:
看第一次排完序是不是:2 4 1 0 5 3 6 8 7 9,跟我上面图解的结果一样滴!
美滋滋。
时间复杂度O(nlogn),空间复杂度也是O(nlogn),因为递归用到栈空间。
还有就是稳定性,快速排序不是稳定的排序,看我画的图就知道了,值是跳来跳去的,跳跃性传递。
阅读全文
1 0
- 排序算法七——快速排序
- 排序算法—快速排序
- 排序算法—快速排序
- 蛙步学排序算法之七 - 快速排序
- Java排序算法(七):快速排序
- 排序算法———快速排序
- 排序算法(一)——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法5——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- c++排序算法——快速排序
- log4j.web.xml
- u-boot中:rm:无法删除 "asm":是一个目录
- 【jzoj5247】【NOIP2017提高A组模拟8.10】【计算几何】【二分答案】
- 10招让你成为杰出的Java程序员
- 0-n之间的1的个数何时等于n(Java程序员面试宝典)
- 排序算法七——快速排序
- AFNetworking 获得header头部的信息 以及添加Content-Type支持的类型
- F
- LinkedHashMap底层源码解读
- 编程练习——用两个栈实现一个队列
- springmvc中的返回值
- CA总线(二)
- javaweb学习总结(四)——Http协议
- laravel笔记-Eloquent ORM(基础)