快速排序 java导包_排序算法-快速排序(Java实现)
上篇我們講了冒泡排序,這次我們講它的升級版快速排序,“快速”,一看就是個好算法~
快速排序(QuickSort)是啥?
我們先看下百度百科的介紹快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
簡單點~
我們可以把快速排序看著三個步驟:
1.選擇基準值:在待排序列中,按照某種方式挑出一個元素,作為基準值。
2.分割操作:以該基準值在序列中的實際位置,把序列分成兩個子序列,一邊是比它大的值,另外一邊是比它小的值。
3.遞歸:對兩個子序列進行快排,直到序列為空或者只有一個元素。
過程演示
這是我畫的一張圖,結合這張圖再看下面的代碼可能會比較好理解一點,當然在看代碼的時候最后可以自己畫一張草圖,可以熟悉一下整個過程,加深理解!
代碼實現
public class QuickSort {
public static void main(String[] args) {
int[] arr = new int[] {9,4,6,8,3,10,4,6};
quickSort(arr,0,arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int low,int high) {
int p,i,j,temp;
if(low >= high) {
return;
}
//p就是基準數,這里就是每個數組的第一個 p = arr[low];
i = low;
j = high;
while(i < j) {
//右邊當發現小于p的值時停止循環 while(arr[j] >= p && i < j) {
j--;
}
//這里一定是右邊開始,上下這兩個循環不能調換(下面有解析,可以先想想)
//左邊當發現大于p的值時停止循環 while(arr[i] <= p && i < j) {
i++;
}
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
arr[low] = arr[i];//這里的arr[i]一定是停小于p的,經過i、j交換后i處的值一定是小于p的(j先走) arr[i] = p;
quickSort(arr,low,j-1); //對左邊快排 quickSort(arr,j+1,high); //對右邊快排
}
}
一些問題
1.什么是基準值:
其實就是在數組里面找一個數,一般選擇數組的第一個數作為基準值,當然這不一定是最佳的基準值,但這不妨礙我們做快速排序。本篇只講標配版的快排,所以就選第一位作為基準值,以后有機會再更新高配版的~
2.快排中為什么一定是右邊先開始循環?
從右邊先開始的前提是我們選擇序列中最左邊的元素最為基準值。
先從右邊開始可以保證i,j相等的時候,arr[i] = arr[j] 小于基準值p。這樣交換之后才能保證基準值左右兩邊分別小于和大于它的值。
我們圖片演示一下:
可以發現如果左邊先走的話將導致分組不成功,即左邊的元素并不是都小于基準值。
本篇完,如果有錯誤的地方歡迎大家指正,一起學習一起進步
我的公眾號:Java小部落
我的個人博客:http://www.fangjiaxian.cn
不定時發發筆記,找一起學習的伙伴,歡迎大家來搞~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的快速排序 java导包_排序算法-快速排序(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android打开4g开关,【VoLTE
- 下一篇: 阿里云定时任务并自动释放