快速排序算法的原理圖解,圖解選擇排序算法及優化

 2023-12-25 阅读 55 评论 0

摘要:作者:敲代碼の流川楓 博客主頁:流川楓的博客 專欄:和我一起學java 快速排序算法的原理圖解,語錄:Stay hungry stay foolish 工欲善其事必先利其器,給大家介紹一款超牛的斬獲大廠offer利器——牛客網 點擊免費注冊和我一起刷題吧???? 文章

ced485cbb11e458d81a746890b32cf3f.gif

作者:敲代碼の流川楓

博客主頁:流川楓的博客

專欄:和我一起學java

快速排序算法的原理圖解,語錄:Stay hungry stay foolish

工欲善其事必先利其器,給大家介紹一款超牛的斬獲大廠offer利器——牛客網

點擊免費注冊和我一起刷題吧????

文章目錄

1. 算法思想

2. 算法圖解

3. 代碼實現

4. 選擇排序算法的優化

5. 選擇排序特點


?

556b41a70265423492026022f8a28ac6.png

1. 算法思想

八大排序算法圖解,1. 找到數組中最大(小)的那個元素

2. 將它和數組的第一個元素交換位置(如果第一個元素就是最大或者最小的元素,那么就和自己交換位置)

3. 在剩下的元素中找到最大(小)的元素,將它與數組的第二個元素交換位置,一直循環,直到整個數組有序

該算法是在不斷地選擇剩余元素之中最大(小)的元素然后進行排序,因此該算法叫做選擇排序

2. 算法圖解

以數組array圖解選擇排序,排序結果為升序

int[] array = {25,33,10,15,70,45};

穩定的排序算法有哪些、2ff6cda2526f4aa4ab79796c2bc0f128.png

?假設每個循環開始第一個數是總是最小,minIndex保存最小數的下標i,i范圍:從0開始到array.length-1

056d85db906541e78c82629d4039cc1f.png

開始遍歷數組,找到最小的數,將索引保存并且交換最小數和當前minIndex所指向的數

9b44579547c644c9a04719e647512861.png

各種排序算法的比較??假設最小數是33,開始向后遍歷,找到最小數15,交換4cf0d2ce5fd44c65b85548da1ccc346c.png

7d09b02125b84ef1937a8e898bbac28b.png

?繼續循環,25當前是最小,自己和自己交換

7299c8a3e27e46cb9582b960f1c3116e.png

??繼續循環,33當前是最小,自己和自己交換

排序算法時間復雜度,3241b12b3dfb4567918d90dda48fdb32.png

?繼續循環,最小數是45,和70交換

964b4e51823c435d9a6ac4755c29bc04.png

fdb0ee8e438f4747b0d21d0ee6bd2ad3.png

??繼續循環,70當前是最小,自己和自己交換b3a5e987c8884dd49ace80d84efda6c6.png

快速排序的優化。至此排序完成

75143ba734f14f3cabf8a35d6db8dad3.png

3. 代碼實現

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));}
}

結果:

3352c140a09a4cfda67b273ba182ceaa.png

4. 選擇排序算法的優化

思路:一般是在一趟遍歷中,同時找出最大值與最小值,放到數組兩端,這樣就能將遍歷的趟數減少一半

歸并排序圖解?74671e65796e4c21951915c235f12139.png

遍歷數組找到最大值和最小值 ,?將最小值放到數組left處,將最大值放到數組right處,然后繼續重復操作,直至排序完成

d069e0695a7947799d8bfd181b29b980.png

0754a3f05ab2412e85e841a560544bc9.png

代碼:?

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));}
}

八大排序算法。結果:?

b11891b3bf4e4353a89c1cb8e10fdf57.png

5. 選擇排序特點

????????待排序序列中,元素個數較少時,適合選用選擇排序,時間復雜度為O(n2)
??在選擇排序中,每趟都會選出最大元素與最小元素,然后與兩端元素交換,此時,待排序序列中如果存在與原來兩端元素相等的元素,穩定性就可能被破壞

“ 本期的分享就到這里了,?記得給博主一個三連哈,你的支持是我創作的最大動力!

ced485cbb11e458d81a746890b32cf3f.gif

選擇排序算法。?

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196795.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息