快速排序:这个算法搞了快一下午,终于搞懂了。
现在习惯每次写代码前把所有思路等全部先写遍,写到注释里。所以直接贴代码了
复杂度:
在最优的情况下,快速排序算法的时间复杂度为O(nlogn)。在最坏的情况下,最终其时间复杂度为O(n2)。平均情况,空间复杂度也为O(logn)。
package quick; import org.omg.Messaging.SYNC_WITH_TRANSPORT; import java.util.Queue;
package quick;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
import java.util.Queue;
/*快速排序:
* 思想:不断地选取线性表中的一个点,对它进行排序,把小于它的数放在左边,大于它的数放在右边
* 当对每个点都进行了选取排序,那么我们的线性表就完成顺序排序
* 算法设计思路:设计两个哨兵一个是low,high分别存储最左侧的点和最右侧的点,再设计一个基准数pivot用于把数按大小放在这个数的两边
* 因为当一个点排序后,会把他分成两部分,我们接下来再对左侧以同样的方式排序。知道左侧全部有序,再去分右侧,那么我们可以用递归来实现
* 递归的基本结构:
* 第一部分:找点,并对这个点进行排序
* 第二部分:先对找好的点的左侧进行排序,也就是递归调用这个函数。
* 第三部分:左侧完了再调用右侧开始排序,也是递归调用这个函数
* 那么什么时候不调用呢?就是当low>=high时。这时相当于第一个循环已经结束了
* */
public class Quick {
public static void main(String[] args){
int[] quick = new int[]{0, 4, 2, 3, 2, 52, 2, 1, 6, 42, 54};//初始化操作数组
System.out.print("排序前:");
for (int f : quick) {
System.out.print(f+",");
}
System.out.println(" ");
QSort(quick,1,quick.length-1);
System.out.print("排序后:");
for (int f : quick) {
System.out.print(f+",");
}
}
public static void QSort(int[] quick,int low,int high) {//这是递归函数,需要获得参数,分别是顺序表,low,high
int pivot;//设置一个准基数
if (low < high) {//当low=high时相当于最底层的递归已经结束了
pivot = partitation(quick, low, high);//选取准基数,并对它进行排序(从1开始),返回准基数便于后面使用
QSort(quick, low, pivot - 1);//进行递归遍历左侧,开始的点一直是low,也就是最左侧,结束的点是上一层准基数的前一个
QSort(quick, pivot + 1, high);//递归遍历右侧,开始的点是准基数的后一个,结束的点是最后一个
}
}
public static int partitation(int[] quick,int low,int high){//选取准基数,并且进行点的左右大小排序
int pivotkey=quick[low];//选择准基数为quick[low]
while (low<high) {//从表的两端向中间扫描,当low<high时才进行扫面
//因为都是选取左边第一个数为准基数,我们就从右边开始往左边扫描,也就是high开始
//第一个判断条件low<high时是为了判断减后是否已经查完所有了
//当发现quick[high]<quick[low],交换过来,让小的数跑到这个数的左边,这个时候准基数跑到了high的位置
while(low<high&&quick[high]>=pivotkey){ //这句执行完后要么low==high,要么到了符合交换条件的地方
high--;
}//high向左平移一位
swap(quick,low,high);//把比准基点小的交换到左边来,这个时候准基数跑到了high的位置
//当发现quick[high]>quick[low],交换,这时准基数跑到了low的位置
while (low<high&&quick[low]<=pivotkey){
low++;
}//low向右平移一位
swap(quick,low,high);//把比准基点大的交换到右边来,这个时候准基数跑到了low的位置
}
return low;
}
public static void swap(int[] L,int i,int j){//交换函数
int k;
k=L[i];
L[i]=L[j];
L[j]=k;
}
}
这里推荐一下我看的一个短视频,就几分钟,但是看完立马能了解算法的原理,就是有些魔性,现在看到这个算法脑海里就是一群人欢脱的跳舞:https://www.bilibili.com/video/av17004952?from=search&seid=10113002062423283368