堆排序,歸併排序

2021-07-22 02:16:30 字數 1657 閱讀 3836

1.介紹:對簡單的選擇排序的一種改進,改進效果非常明顯,每次在選擇最小記錄的同時,並根據比較結果對其他記錄做出相應的調整,那麼排序效率就會提高很多。

定義:將待排序的序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將它移走(其實就是將其與堆陣列的末尾元素進行交換,此時末尾元素就是最大值),然後將剩餘的n-1個元素序列從新構造成乙個堆,這樣就會得到n個元素中的次大值。如此反覆進行,就能得到乙個有序序列。

public static void heapsort(int arr) 

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

}/**

* 構造大頂堆

* * @param arr

* @param i

* @param length 陣列的長度

*/private static void heapadjust(int arr, int i, int length)

if (temp >= arr[j])

arr[i] = arr[j];

i = j;//此時從新迴圈新的節點(剛跟i交換資料的那個節點後面的左,右節點)

}//將原先堆頂的元素放到最後的位置,也就是j的位置。

arr[i] = temp;

}

1.介紹:將初始序列兩兩進行排序,然後在兩兩歸併,如此重複,得到乙個長度為n的有序序列為止。

public static void mergesort(int arr) 

private static void sort(int arr, int temp, int left, int right)

/** * 將兩個陣列進行歸併

* * @param arr

* @param left

* @param center

* @param right

*/private static void merge(int arr, int temp, int left, int center, int right) else

}//左邊剩餘資料依次放入臨時陣列中

while (left <= center)

while (mid <= right)

//複製陣列

while (start <= right)

}

介紹:選取乙個中間值,第一次排序,將比這個中間值大的所有資料放入後面,比它小的所有資料放入前面,再依次從該數後面和前面的陣列中依次排序。

public static void quicksort(int arr) 

private static void sort(int arr, int low, int high)

}private static int partition(int arr, int low, int high)

//只是替換,優化不必要的交換

arr[low] = arr[high];

while (low < high && arr[low] <= pivotket)

arr[high] = arr[low];

}arr[low] = pivotket;

return low;

}

歸併排序和堆排序

歸併排序的演算法我們通常用遞迴實現,先把待排序區間 s,t 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間 s,t 桶排序法,非常耗空間。規定陣列中元素的最大值不超過陣列的長度,否則要先求出陣列元素的最大值後,才能指定空桶的個數,要求待排序陣...

堆排序和歸併排序

極少涉及,在此就不再研究 了!堆排序 原理 把待排序的元素按照大小在二叉樹位置上排列,排序好的元素要滿足 父節點的元素要大於等於子節點 這個過程叫做堆化過程,如果根節點存放的是最大的數,則叫做大根堆,如果是最小的數,則叫做小根堆,可以把根節點拿出來,然後再堆化,迴圈到最後乙個節點。時間複雜度 平均 ...

python堆排序 歸併排序

堆排序 堆是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。1 最大堆 最小堆 調整 將堆的末端子節點作調整,使得子節點永遠小於 大於 父節點 2 建立最大堆 小堆 將堆中的所有資料重新排序 3 堆排序 移除位在第乙個資料的根節點,並做最大堆 小堆...