分治算法——快速排序
来源:互联网 发布:无法无天小说吾知 编辑:程序博客网 时间:2024/06/06 00:57
快速排序是所有排序里最受欢迎的排序算法,时间复杂度O(NlogN),如果测试数据是有序的话,时间复杂度会下降到线性,也就是O(N^2),算法的核心思想是:挖坑填数。算法代码一般采用递归的形式。
算法思想:
找到一个基准数,也叫哨兵,在我的代码中为temp,用这个基准数去比较其他的所有数字,如果是从小到大排序的话,就让基准数左边的数都小于它,右边的数都大于它,如果是从大到小的话,反之。然后再把它左边的数再这样操作一遍,右边的数也这样操作一遍,依次递归,直到整个数字集合里只剩下一个数,则默认为这个数是有序的,返回。
举个例子:
共有5个数,分别为1 5 2 4 3.
第一次操作,操作的数分别为1 5 2 4 3。默认基准数为第一个数,或者或者随便什么一个数,这里默认为第一个数。第一个数为1,它右边的数都大于它,所以第一次操作的结果为:1 5 2 4 3.
第二次操作,因为1的左边没有数,直接退出。
第三次操作,操作的数分别为5 2 4 3。选基准数为5,5是最大的,所以第三次的操作结果为:2 4 3 5。
第四次操作,操作的数分别为2 4 3,。选基准数为2,2是最小的,所以第四次的操作结果为:2 4 3。
第五次操作,因为5是最大的,右边没有数,直接退出。
第六次操作,操作的数分别分为4 3,选基准数为4,操作结果为:3 4。
第六次操作,因为4左边没有数,退出。
第七次操作,操作的数为3,只有一个数,默认有序,退出。
代码:
#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>int num[1001];void q_sort(int l,int r){ if(l>r)return; int i = l,j = r; int temp = num[i]; while(i!=j) { while(i<j&&num[j]>=temp)j--; while(i<j&&num[i]<=temp)i++; if(i<j)std::swap(num[i],num[j]); } num[l] = num[i]; num[i] = temp; q_sort(l,i-1);q_sort(i+1,r);}int main(){ int n; std::cin>>n; for(int i = 0;i<n;i++)std::cin>>num[i]; q_sort(0,n-1); for(int i = 0;i<n;i++)std::cout<<num[i]<<" "; return 0;}
阅读全文
1 0
- 分治算法——快速排序
- 分治算法——快速排序
- 分治算法——快速排序,归并排序
- 分治算法——归并排序与快速排序
- 分治算法-快速排序
- 分治算法----快速排序
- 快速排序-分治算法
- 分治算法---快速排序
- 分治算法 快速排序
- 0005算法笔记——【分治法】快速排序
- 0005算法笔记——【分治法】快速排序
- 算法09:快速排序——分治法Part5
- 算法笔记——【分治法】快速排序
- 算法笔记0005——【分治法】快速排序
- 【算法】快速排序——基于分治思想的实现
- 0005算法笔记——【分治法】快速排序
- 算法分析——分治思想之快速排序
- 分治算法之快速排序
- react native环境搭建+genymotion
- MyBatis的事务处理的方式
- 【P1010-幂次方】解题记录
- 【线段树】COCI2010-2011(CONTEST#6)[STEP]题解
- Python的编码问题
- 分治算法——快速排序
- 教你如何学习自动化测试
- 计算机网络基础知多少
- Project facet Java 1.8 is not supported by target runtime Apache Tomcat v8.0解决
- Android adb shell KeyCode列表
- 算法练习_LeetCode_链表1
- leetcode--max-points-on-a-line
- set集合和list集合的区别
- 正则表达式 REGEXP_REPLACE