每周算法——“快速排序GET”
快速排序GET
01
本周给大家分享的是关于“快速排序”的相关算法。相信不论是学弟学妹,还是学长学姐都接触过相关编程方面的知识。希望来自“乾历之家”兴趣小组分享的相关编程算法,可以让我们产生精神上的共鸣,现在就让我们一起来研究一下本周算法吧。
关于算法的定义
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
关于“快速排序”
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
关于算法的特征
有穷性,确切性,输入项,输出项,可行性。
1. 有穷性(Finiteness)
算法的有穷性是指算法必须能在执行有限个步骤之后终止
2. 确切性(Definiteness)
算法的每一步骤必须有确切的定义
3. 输入项(Input)
一个算法有0个或多个输入
以刻画运算对象的初始情况
所谓0个输入是指算法本身定
出了初始条件
4. 输出项(Output)
一个算法有一个或多个输出
以反映对输入数据加工后的结果
没有输出的算法是毫无意义的
5. 可行性(Effectiveness)
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤
即每个计算步都可以在有限时间内完成(也称之为有效性)
时间复杂度图
快排思想图
//快速排列核心代码
void quick_sort(int arr[],int start,int end)
{
if(start>=end)
return;
int i=start-1;
int j=end+1;
int k=arr[start+end>>1];
while(i<j)
{
do i++;while(arr[i]<k);
do j--;while(arr[j]>k);
if(i>j)swap(arr[i],arr[j]);
}
quick_sort(arr,start,j)
quick_sort(arr,j+1,end);
}
02
最后,我们设计了一个跟大家思考、进步的环节。下面就是相关问题,希望大家可以积极投稿分享专属你的答案(本期题目参考代码请见下期“每周算法”)。
本周练习题目:
给定你一个长度为 n 的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
本周练习
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
输出共一行,包含n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
6
13 12 6 9 4 17 1
输出样例:
1 4 6 9 12 13 17