算法基础:快速排序算法原理与实现
2017-02-23 00:39
225 查看
高快省的排序算法
有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”
在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。
步骤如下:
在序列中选择一个关键元素做为轴;
对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;
递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。
快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。
当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。
补充理解:
快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。
有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”
在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。
步骤如下:
在序列中选择一个关键元素做为轴;
对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;
递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。
#include<stdio.h> #include<stdlib.h> typedef int Item; #define key(A) (A) #define less(A,B) (key(A)<key(B)) #define exch(A,B) {Item t=A;A=B;B=t;} #define compexch(A,B) if(less(B,A)) exch(A,B) int partition(int a[],int l,int r) { int v=a[r]; int i=l-1,j=r; while(1) { while(a[++i]<=v) if(i==r) break; while(a[--j]>=v) if(j==l) break; if(i>=j) break; exch(a[i],a[j]); } exch(a[i],a[r]); return i; } void quickSort(int a[],int l,int r) { if(l>=r) return; int i=partition(a,l,r); quickSort(a,l,i-1); quickSort(a,i+1,r); } int main(int argc,char *argv[]) { int N=atoi(argv[1]); Item *a=(Item*)malloc(N*sizeof(Item)); for(int i=0;i<N;i++) a[i]=1000*(1.0*rand()/RAND_MAX); for(int i=0;i<N;i++) printf("%3d ",a[i]); printf("\n"); quickSort(a,0,N-1); for(int i=0;i<N;i++) printf("%3d ",a[i]); printf("\n"); return 0; }
快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。
当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。
补充理解:
快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。下面上个霸气的图来描述下整个算法的处理过程。
相关文章推荐
- 深度学习基础模型算法原理及编程实现--04.改进神经网络的方法
- 深度学习基础模型算法原理及编程实现--02.线性单元
- 深度学习基础模型算法原理及编程实现--03.全链接
- 算法基础:基本排序算法原理、实现与总结
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
- 十大基础应用算法及C++实现(一)----快速排序算法
- 快速排序算法的实现及相关测试算法的原理与实现
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
- <基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
- 深度学习基础模型算法原理及编程实现--05.卷积神经网络
- 深度学习基础模型算法原理及编程实现--01.感知机
- 深度学习基础模型算法原理及编程实现--06.循环神经网络
- 算法基础:堆排序原理及其实现
- 算法基础:归并排序算法原理与实现
- 深度学习基础模型算法原理及编程实现--09.自编码网络
- TCP/IP原理、基础以及在Linux上的实现 (2)
- Canny边缘检测算法原理及其VC实现详解(二)
- 决策树分类和预测算法的原理及实现
- 机器学习算法原理总结系列---算法基础之(11)聚类K均值(Clustering K-means)