八大排序算法之选择排序算法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                八大排序算法之选择排序算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                文章目錄
- 一:簡單選擇排序算法
 - 1:思想
 - (1):概念
 - (2):舉例驗證
 
- (3):上碼
 - (3):時間復雜度和穩定性
 
- 二:堆排序
 - 1:什么是堆
 - 2:堆排序的原理(以升序序列為例)
 - 3:堆排序算法的具體過程
 - (1):先將無序序列建成一個堆
 - (2):調換堆頂元素后,再調整剩下的元素為一個新的堆
 
- 4:上碼
 - (1):heapSort函數
 - (2):adjustHeap函數(調整數組為大頂堆)
 
一:簡單選擇排序算法
1:思想
(1):概念
- 總共有n個數,同時下標是從0到n-1;
 - 我們要進行n-1趟的交換
 - 每一趟在 (n-i)-1個記錄中尋找出最小值(也就是找出該數組下標后面數中的最小值),與i下標所代表的值進行比較,如果比其小那么就進行交換(前提我們是求得是升序)。
 
(2):舉例驗證
- 文字驗證
第一次從 arr[1]~arr[n-1]中選取最小值,與 arr[0]作比較 判斷是否交換 
第二次從 arr[2]~arr[n-1]中選取最小值,與 arr[1]作比較 判斷是否交換
第三次從 arr[3]~arr[n-1]中選取最小值,與 arr[2]作比較 判斷是否交換
第 i 次從 arr[i]~arr[n-1]中選取最小值,與 arr[i-1]作比較 判斷是否交換
第 n-1 次從 arr[n-1]~arr[n-1]中選取最小值,與 arr[n-2]作比較 判斷是否交換
總共是要進行n-1輪
- 實例驗證
 
(3):上碼
public static void simpleSort(int [] arr) {for (int i = 0; i < arr.length-1; i++) {//表示輪數int min = arr[i];int minIndex = i;for (int j = i+1; j < arr.length; j++) {//尋找i后面數的最小值if (arr[j] < min) {min = arr[j];minIndex = j;}}if (i != minIndex) {//交換當前下標i代表的數和求出的arr[minIndex] = arr[i];arr[i] = min;}}}(3):時間復雜度和穩定性
- O(n^2)
 - 不穩定
 
二:堆排序
1:什么是堆
堆是具有下列性質的完全二叉樹,每個結點的值都大于或等于其左右結點的的值,稱為大頂堆;
每個結點值都小于等于其左右節點的值稱為小頂堆。
2:堆排序的原理(以升序序列為例)
- 首先將無序序列中n個元素構造成一個大頂堆
 - 此時整個序列的最大值就是根節點
 - 然后將根節點和和數組中的末尾元素進行交換,那么此時最后的元素就是最大值
 - 然后再將剩余的的n-1個元素,重新進行調整,然后構造成一個大頂堆,如此反復進行,我們最終就會得到一個有序序列了
 
3:堆排序算法的具體過程
(1):先將無序序列建成一個堆
for(int i = arr.length/2-1; i >= 0; i--) {//這里的arr.length/2-1,是求出adjustHeap(arr,i,arr.length); //完全二叉樹中最后一個非葉節點的下標。 }(2):調換堆頂元素后,再調整剩下的元素為一個新的堆
for(int i = arr.length-1; i > 0; i--) {//交換跟根節點和數組最后的元素的值,(這里最后的值是不斷往前的)int temp = arr[0];arr[0] = arr[i];arr[i] = temp; //調整n-i個元素為一個大頂堆 adjustHeap(arr,0,i-1); }4:上碼
(1):heapSort函數
//heapSort函數 (調整無序序列為大頂堆;將堆頂元素和數組最后的元素進行交換,然后將剩下的元素重新調整為大頂堆) public static void heapSort1(int arr[]) {//調整無序序列為大頂堆;for (int i = arr.length/2-1; i >= 0 ; i--) {adjustHeap(arr,i, arr.length-1);}//將堆頂元素和數組最后的元素進行交換,然后將剩下的元素重新調整為大頂堆(經過n-1次循環我們將得到一個升序的序列)for (int i = arr.length-1; i > 0 ; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;adjustHeap(arr,0,i-1);//從 根結點開始重新調整為大頂堆} }(2):adjustHeap函數(調整數組為大頂堆)
//adjustHeap(向下調整) public static void adjustHeap(int arr[],int index,int length) {//k = 2 * index + 1 表示的是左節點, k = 2*index + 2表示的是右結點for (int k = 2*index+1; k <= length ; k = k * 2 + 1) {//比較該結點的左右孩子結點的值誰大if (k+1 <= length &&arr[k] < arr[k+1]) k++;//右結點值比較大if (arr[k] > arr[index]) { //子結點的值比父節點值大的話int temp = arr[index];//需要調整的根節點arr[index] = arr[k];//那就孩子結點跟父節點進行交換arr[k] = temp;index = k;//更新index,將孩子結點作為新的根節點繼續往下進行比較} else {break;}} }總結
以上是生活随笔為你收集整理的八大排序算法之选择排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: java并发之CAS
 - 下一篇: PGP如何加密解密