經典排序演算法

2021-09-08 09:27:25 字數 3451 閱讀 9086

元素進行兩兩比較,若第乙個比第二個大,則交換它們的值;

執行比較和交換(n-1次),直到到達陣列的最後乙個元素,冒出的元素則為陣列中的最大值;

重複1,2步驟

//進行冒泡操作

void bubble(int arr, int n) }}

//氣泡排序

void bubblesort(int arr, int n)

}

先在資料中找出最大或最小的元素,放到序列的起始;

然後再從餘下的資料中繼續尋找最大或最小的元素,依次放到排序序列中,直到所有資料樣本排序完成

// 找到最大值所在的位置

int findmax_pos(arr, int n)

return pos; }}

//選擇排序

void selectsort(arr, int n)

}

先將待排序序列的第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列;

然後從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置,直到所有資料都完成排序;如果待插入的元素與有序序列中的某個元素相等,則將待插入元素插入到相等元素的後面。

a[i + 1] = key;//找到合適的位置了,賦值,在i索引的後面設定key值。}}

希爾排序,也稱遞減增量排序演算法,實質是分組插入排序。由 donald shell 於2023年提出。希爾排序是非穩定排序演算法。

先將整個資料序列分割成若干子串行分別進行直接插入排序;

待整個序列中的記錄基本有序時,再對全部資料進行依次直接插入排序

void shell_sort(int arr, int n)

a[k] = temp;}}

} }}

歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。

把當前陣列分化成n個單位為1的子陣列,然後兩兩比較合併成單位為2的n/2個子陣列;

繼續進行這個過程,按照2的倍數進行子陣列的比較合併,直到最終陣列有序

快速排序也是利用分治法實現的乙個排序演算法。快速排序和歸併排序不同,它不是一半一半的分子陣列,而是選擇乙個基準數,把比這個數小的挪到左邊,把比這個數大的移到右邊。然後不斷對左右兩部分也執行相同步驟,直到整個陣列有序。

用乙個基準數將陣列分成兩個子陣列

將大於基準數的移到右邊,小於的移到左邊

遞迴的對子陣列重複執行1,2,直到整個陣列有序

//left 為左起始位置, right 為右終點位置

void quicksort(int arr, int left, int right)

} //最終將基準數歸位

a[left] = a[i];

a[i] = temp;

quicksort(arr, left, i-1); //繼續處理左邊的,遞迴方式

quicksort(arr, i+1, right); //繼續處理右邊的

}

堆排序經常用於求乙個陣列中最大k個元素時。因為堆實際上是乙個完全二叉樹,所以用它可以用一維陣列來表示。因為最大堆的第一位總為當前堆中最大值,所以每次將最大值移除後,調整堆即可獲得下乙個最大值,通過一遍一遍執行這個過程就可以得到前k大元素,或者使堆有序。

首先了解在一維陣列中節點的下標:

i節點的父節點下標 parent(i) = floor((i-1)/2)

i節點的左子節點下標 left(i) = 2i + 1

i節點的右子節點下標 right(i) = 2i + 2

演算法步驟:

構造最大堆(build max heap): 首先將當前元素放入最大堆下乙個位置,然後將此元素依次和它的父節點比較,如果大於父節點就和父節點交換,直到比較到根節點。重複執行到最後乙個元素。

最大堆調整(max heapify): 調整最大堆即將根節點移除後重新整理堆。整理方法為將根節點和最後乙個節點交換,然後把堆看做n-1長度,將當前根節點逐步移動到其應該在的位置。

堆排序(heapsort):重複執行2,直到所有根節點都已移除。

void max_heapify(int arr, int start, int end)

// 若父節點大於子節點代表調整完畢,直接跳出函式;否則交換父子內容,後再繼續子節點和孫節點的比較

if(arr[dad] > arr[son])

else }}

//堆排序(先建立乙個最大堆,然後將堆頂元素和最後乙個元素交換 ,接著調整除最後乙個元素的滿二叉樹為最大堆)

void heap_sort(int arr, int len)

//將堆頂元素和最後乙個元素交換 ,接著調整除最後乙個元素的滿二叉樹為最大堆,以此類推

for(int i = len - 1; i >= 0; i-- )

}

堆排序的整個過程如下圖所示:

經典排序演算法

排序分為內部排序和外部排序,內部排序是指待排序的資料都是在記憶體中的,例如陣列 外部排序指待排序資源在記憶體外,例如對檔案的排序。此篇說的是內部排序。通俗地來說,內部排序就是將一堆資料按一定規則對它進行排序。排序又分為穩定排序和不穩定的排序,如果初始序列ai,ak有序 ai ak 排序後變成了ak,...

經典排序演算法

1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...

經典排序演算法

思想 相鄰元素兩兩比較大的往下沉,小的往上浮.具體點說就是兩相鄰元素相互比較,如果前面的元素比後面的大就換位置,否則繼續比較.舉個例子吧 將陣列arr 排序 廢話了那麼多,接下來是應該有 的對吧public static void bulletsort int arr 原理 用乙個索引位置上的元素,...