快速排序算法
来源:互联网 发布:linux 文件夹读写权限 编辑:程序博客网 时间:2024/06/16 00:42
面试中较为常见的算法之一就是快速排序,快速排序在实际排序应用中也是最好的选择,因为它的平均性能非常好,它的期望复杂度为nlgn,另外,它还是一种稳定的排序方法。快速排序利用分治思想,将待排序数组分成左右两个部分,然后对其分别递归调用快速排序算法。
下面通过一个例子介绍快速排序算法的思想,假设要对数组a[10]={6,1,2,7,9,3,4,5,10,8}进行排序,首先要在数组中选择一个数作为基准值,这个数可以随意选择,在这里,我们选择数组的第一个元素a[0]=6作为基准值,接下来,我们需要把数组中小于6的数放在左边,大于6的数放在右边,怎么实现呢?
我们设置两个“哨兵”,记为“哨兵i”和“哨兵j”,他们分别指向数组的第一个元素和最后一个元素,即i=0,j=9。首先哨兵j开始出动,哨兵j一步一步地向左挪动(即j–),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。
最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。此时就需要交换i和j指向的元素的值。
交换之后的数组变为a[10]={6,1,2,5,9,3,4,7,10,8}:
第一次交换至此结束。接下来,由于哨兵i和哨兵j还没有相遇,于是哨兵j继续向前,发现比6小的4之后停下;哨兵i继续向前,发现比6大的9之后停下,两者再进行交换。交换之后的数组变为a[10]={6,1,2,5,4,3,9,7,10,8}。
第二次交换至此结束。接下来,哨兵j继续向前,发小比6小的3停下来;哨兵i继续向前,发现i==j了!!!于是,这一轮的探测就要结束了,此时交换a[i]与基准的值,数组a就以6为分界线,分成了小于6和大于6的左右两部分:a[10]={3,1,2,5,4,6,9,7,10,8}。
至此,第一轮快速排序完全结束,接下来,对于6左边的半部分3,1,2,5,4,执行以上过程;对于6右边的半部分9,7,10,8,执行以上过程,直到不可拆分出新的子序列为止。最终将会得到这样的序列:1 2 3 4 5 6 7 8 9 10,到此,排序完全结束。
下面给出快速排序的C语言实现,也可以访问我的github下载源代码:
//使用了全局变量,较不方便#include <stdio.h> int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quicksort(int left,int right) { int i,j,t,temp; if(left > right) return; temp = a[left]; //temp中存的就是基准数 i = left; j = right; while(i != j) { //顺序很重要,要先从右边开始找 while(a[j]>=temp && i<j) j--; //再找左边的 while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置 if(i<j) { t = a[i]; a[i] = a[j]; a[j] = t; } } //最终将基准数归位 a[left] = a[i]; a[i] = temp; quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程 quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程 } int main() { int i,j,t; //读入数据 scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); quicksort(0,n-1); //快速排序调用 //输出排序后的结果 for(i=0;i<n;i++) printf("%d ",a[i]); return 0; }
//与上面完全相同,只是没有使用全局变量,更灵活#include <stdio.h> void QuickSort(int array[], int low, int high){ int i = low; int j = high; int temp = array[low]; while(i != j) { while(array[j] >= temp && i < j) { j--; } while(array[i] <= temp && i < j) { i++; } if(i < j) { int t = array[i]; array[i] = array[j]; array[j] = t; } } //将基准temp放于自己的位置,(第i个位置) array[low] = array[i]; array[i] = temp; QuickSort(array, low, i - 1); QuickSort(array, i + 1, high);}int main(){ int a[8] = {1,4,7,2,3,6,5,8}; QuickSort(a, 0, 7); for(int i = 0; i < 8; i++) { printf("%d\n",a[i]); } return 0;}
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- Video http dash mp4 box slice
- 6. vue.js-饿了吗全套-项目文件介绍
- spring和mybatis整合
- 深度学习笔记——理论与推导之Structured Learning【Learning with Hidden Information】(九)
- 1099. Build A Binary Search Tree (30)建立二叉搜索树
- 快速排序算法
- Symbol
- 系列化
- stm32 Bootloader设计(YModem协议)
- linuxc网络通信
- Windows10安装Tensorflow1.3
- Learning Nginx
- presto集群安装以及集成kerberos
- 如何用python构建一个简单的类