面试必备排序算法 --快速排序
Posted 一个程序员的进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必备排序算法 --快速排序相关的知识,希望对你有一定的参考价值。
算法是一个程序员数学能力和思维能力最好的展现。
虽然类库已经帮助我们是实现了各种经典的排序算法,但是理解经典的排序算法对我们是非常有益处的,并且我们也可以借用经典算法的设计思想对我们的日常工作乃至生活起到帮助作用。
排序作为面试中经常会问到算法题,快速排序又是排序中经常被问到的排序算法是非常值的我们来了解一番乃至可以使用白板写出来。
在了解排序算法前,先来了解一下我们在学校接触到的两个排序算法: 冒泡排序,选择排序
冒泡排序
理解算法最重要的是理解理解其思想而不是去背他的实现代码,只有理解了其思想我们才能彻底理解这个算法。
冒泡排序的整体思路是:
1. 数组中索引0和索引1比较,如果第索引0的值大于索引1的值则交换顺序
2. 索引2的值和索引3的值比较,以此类推
3. 经过多轮循环最终达到有序
整个算法的就像是冒泡一样最大的元素最先被排序好。
public static void main(String[] args) {
int [] arry = new int[]{6 , 1 , 2 , 7 , 9 , 3 , 4 , 5 , 10, 8 };
for(int i =0 ; i<arry.length - 1; i ++ ){
for(int j = 0; j < arry.length-i-1 ; j++){//每轮排序后最右边的元素冒出
if(arry[j] > arry[ j +1 ]){//如果第一个元素大于第二个元素进行冒泡
int temp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = temp;
}
}
}
for(int element: arry){
System.out.printf("%d ", element);
}
System.out.println("");
}
执行一轮如下代码:
for(int j = 0; j < arry.length-i-1 ; j++){//如果第一个元素大于第二个元素进行冒泡
if(arry[j] > arry[ j +1 ]){ int temp = arry[j];
arry[j] = arry[j+1];
arry[j+1] = temp;
}
}
(第一轮后的结果)
冒泡排序最坏情况下每次比较都会互换元素位置。
选择排序
选择排序整体思路:
1.数组中索引0的值和索引1的值比较,如果索引1小于索引0的值,则记min的值为索引1
2.继续比较索引2和索引1(索引1的值小于索引0),如果索引2小于索引1的值,则记min的值为索引2
3.依次向右,比较值
4.经过多轮达到有序代码
public static void main(String[] args) { //和冒泡排序为同一数组
int [] arry = new int[]{6 , 1 , 2 , 7 , 9 , 3 , 4 , 5 , 10, 8 }; for(int i = 0; i< arry.length; i++){ int min = i;//本次循环最小值的索引
for(int j = i+1; j < arry.length; j++){ if(arry[j] < arry[min] ){
min = j;
}
} if(min != i){//如果有比当前元素小的元素
//则交换
int temp = arry[i];
arry[i] = arry[min];
arry[min] = temp;
}
} //迭代(java5提供的foreach语法糖)
for(int element: arry){
System.out.printf("%d ", element);
}
System.out.println("");
}
(第一轮结果)
快速排序
快速排序利用分治的思想对数组进行排序
快速排序算法整体思路:
1.寻找一个基点元素,一般直接使用第一个元素
2.对数组排序,所有大于基点元素的位于基点元素位置的右边
3.对数组排序,所有小于基点元素的位于基点元素位置的左边
4.对基点元素左右的数组按照上述1,2,3排序
例如:2,1,3,4
public static void main(String[] args) { int [] arry = new int[]{6 , 1 , 2 , 7 , 9 , 3 , 4 , 5 , 10, 8 };
quickySort(arry,0, arry.length - 1 );
}
public static void quickySort(int [] arry, int lo, int hi){
if(lo > hi) return; int j = partition(arry, lo, hi);
quickySort(arry, lo, j - 1);
quickySort(arry, j+1, hi);
}
public static int partition(int [] arry, int lo, int hi){
int base = arry[lo];//基准值
int i = lo + 1 , j = hi;
while(i < j ){// 如果i >= j 表示已经排序完成
while( arry[j] > base && i < j ){// 从后向前找到小于基准值的值
j-- ;
}
while(arry[i] < base && i < j){//从前向后找到大于基准值的值
i++;
}
if(i < j){
int temp = arry[i];
arry[i] = arry[j];
arry[j] = temp;
}
}
int temp = arry[j];
arry[j] = base;
arry[lo] = temp;
for(int c =0 ; c < arry.length; c++){
System.out.printf("%d ",arry[c]);
}
System.out.println("");
return j;//返回基准值排序后的索引
}
(第一轮结果)
理解了以上三个排序算法的思想,试一试自己能不能实现冒泡、选择、快速排序。
最后推荐《算法》第四版这本书,给喜欢研究算法的同学。
觉得不错
可以关注、转发哦
微信搜索:codexiulian
长按扫码即可关注我
除了有趣的技术文章
还有懂你的机器人小助手等你来
撩
以上是关于面试必备排序算法 --快速排序的主要内容,如果未能解决你的问题,请参考以下文章