排序知多少 堆排序詳解

2021-10-02 03:29:42 字數 1000 閱讀 2515

堆是具有下列特性的完全二叉樹:每個節點的值都大於或等於其左右孩子的節點的值,成為大頂堆,或者每個節點的值都小於或等於其左右孩子節點的值,成為小頂堆。

在選擇到最小記錄同時,並根據比較結果對其他記錄做出相應調整。這樣的排序整體效率非常高。

堆排序(heap sort)就是利用堆進行排序的方法。他的基本思想是,將待排序的序列構造成乙個大頂堆,此時,整個序列的最大值就是對定的根節點。將他移走(其實就是將其餘對陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構成乙個堆,這樣就會得到n個元素中的次小值。如此反覆,便能得到乙個有序序列。

他的執行時間主要是消耗在初始結構建堆和在重建堆時的反覆篩選上。

在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端節點開始構建,將它與其他孩子進行比較和有必要的交換,對於每個非終端節點來說,其實最多進行兩次比較和互換,因此整個構建堆的時間複雜度為o(n)。

在正式排序時,第i次取堆頂記錄重建堆需要用o(logi)的時間,並且需要取n-1次堆頂記錄。因此,重建堆的時間複雜度為o(nlogn)。

空間複雜度上,它只有乙個用來交換的暫存單元,也非常不錯,不過由於記錄的比較與交換是跳躍式進行,因此堆排序也是一種不穩定的排序方法。

public class main 

heapsort(arr);

system.out.println(arrays.tostring(arr));

}private static void heapsort(int arr)

for (i = arr.length - 1; i >= 1; i--)

}private static void heapadjust(int arr, int s, int m)

}if (arr[index] > temp) else

}arr[s] = temp;

}private static void swap(int arr, int s, int e)

}

排序知多少 氣泡排序詳解

1 對元素進行兩次遍歷 2 第一次遍歷所有元素 3 第二次判斷當前元素是否比之後的元素大,如果大則交換位置,否則不動 氣泡排序是一種常用的排序演算法。從思路理解上比插入排序 快排 歸併排序都要簡單。就是做兩次巢狀迴圈,一旦發現前面的數比後面的數大,就交換位置。像氣泡從水裡公升上來一樣,越往上氣泡越大...

氣泡排序知多少

氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。1.比較相鄰的兩個元素。如果第乙個比第二個大,就交換他們兩個。2.對每一對相鄰元素作同...

排序詳解 堆排序

堆排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即a parent i a i 在陣列的非降序排序中,需要使用的就是大根...