作者:敲代碼の流川楓
博客主頁:流川楓的博客
專欄:和我一起學java
快速排序算法的原理圖解,語錄:Stay hungry stay foolish
工欲善其事必先利其器,給大家介紹一款超牛的斬獲大廠offer利器——牛客網
點擊免費注冊和我一起刷題吧????
文章目錄
1. 算法思想
2. 算法圖解
3. 代碼實現
4. 選擇排序算法的優化
5. 選擇排序特點
?
八大排序算法圖解,1. 找到數組中最大(小)的那個元素
2. 將它和數組的第一個元素交換位置(如果第一個元素就是最大或者最小的元素,那么就和自己交換位置)
3. 在剩下的元素中找到最大(小)的元素,將它與數組的第二個元素交換位置,一直循環,直到整個數組有序
該算法是在不斷地選擇剩余元素之中最大(小)的元素然后進行排序,因此該算法叫做選擇排序
以數組array圖解選擇排序,排序結果為升序
int[] array = {25,33,10,15,70,45};
穩定的排序算法有哪些、
?假設每個循環開始第一個數是總是最小,minIndex保存最小數的下標i,i范圍:從0開始到array.length-1
開始遍歷數組,找到最小的數,將索引保存并且交換最小數和當前minIndex所指向的數
各種排序算法的比較??假設最小數是33,開始向后遍歷,找到最小數15,交換
?繼續循環,25當前是最小,自己和自己交換
??繼續循環,33當前是最小,自己和自己交換
排序算法時間復雜度,
?繼續循環,最小數是45,和70交換
??繼續循環,70當前是最小,自己和自己交換
快速排序的優化。至此排序完成
import java.util.Arrays;public class ChoiceSort{public int[] sortArray(int[] nums){if(nums.length == 0){return nums;}for (int i = 0; i < nums.length; i++) {int minIndex = i;//最小數的下標,每個循環開始總是假設第一個數是最小數for (int j = i; j < nums.length; j++) {if (nums[j] < nums[minIndex]){//找到最小數minIndex = j;//保存最小數索引}}System.out.println("本輪最小數:"+nums[minIndex]);//交換最小數和當前i所指向的元素int tmp = nums[minIndex];nums[minIndex] = nums[i];nums[i] = tmp;PrintArray.print(nums);System.out.println("————————————————");}return nums;}public static void main(String[] args) {int[] array = {25,33,10,15,70,45};System.out.println("初始數組:");PrintArray.print(array);ChoiceSort choiceSort = new ChoiceSort();choiceSort.sortArray(array);System.out.println("排序完成");PrintArray.print(array);}
}
class PrintArray{public static void print(int[] array){System.out.println(Arrays.toString(array));}
}
結果:
思路:一般是在一趟遍歷中,同時找出最大值與最小值,放到數組兩端,這樣就能將遍歷的趟數減少一半
歸并排序圖解?
遍歷數組找到最大值和最小值 ,?將最小值放到數組left處,將最大值放到數組right處,然后繼續重復操作,直至排序完成
代碼:?
import java.util.Arrays;public class ChoiceSort{public int[] sortArray(int[] nums) {if (nums.length == 0) {return nums;}/*初始化左端、右端元素索引*/int left = 0;int right = nums.length - 1;while (left < right) {/*初始化最小值、最大值元素的索引*/int min = left;int max = right;for (int i = left; i <= right; i++) {/*標記每趟比較中最大值和最小值的元素對應的索引min、max*/if (nums[i] < nums[min])min = i;if (nums[i] > nums[max])max = i;}/*最大值放在最右端*/int temp = nums[max];nums[max] = nums[right];nums[right] = temp;/*此處是先排最大值的位置,所以得考慮最小值(arr[min])在最大位置(right)的情況*/if (min == right)min = max;/*最小值放在最左端*/temp = nums[min];nums[min] = nums[left];nums[left] = temp;/*每趟遍歷,元素總個數減少2,左右端各減少1,left和right索引分別向內移動1*/left++;right--;}return nums;}public static void main(String[] args) {int[] array = {25,33,10,15,70,45};System.out.println("初始數組:");PrintArray.print(array);ChoiceSort choiceSort = new ChoiceSort();choiceSort.sortArray(array);System.out.println("排序完成");PrintArray.print(array);}
}
class PrintArray{public static void print(int[] array){System.out.println(Arrays.toString(array));}
}
八大排序算法。結果:?
????????待排序序列中,元素個數較少時,適合選用選擇排序,時間復雜度為O(n2)
??在選擇排序中,每趟都會選出最大元素與最小元素,然后與兩端元素交換,此時,待排序序列中如果存在與原來兩端元素相等的元素,穩定性就可能被破壞
“ 本期的分享就到這里了,?記得給博主一個三連哈,你的支持是我創作的最大動力!
選擇排序算法。?
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态