幾種經典排序演算法

2021-07-23 06:39:20 字數 2600 閱讀 3508

據說第乙個正確的快排演算法程式是在快排思想提出後的兩三年才有人寫出來,我們都是站在巨人的肩上碼**啊。

演算法:

一趟排序為,選出乙個哨兵元素,可以為左邊第乙個,然後從序列的最左邊開始遍歷,選出比哨兵元素小的元素下標,標記為r,從序列的左邊開始遍歷,選出比哨兵元素大的元素下邊,標記為l,然後r、l下邊的元素對換,然後重複上述遍歷對換的操作,直至l下標不再下與r下標。將哨兵元素跟l元素對換。這樣為一趟,就將哨兵元素的左邊與右邊分成兩個子串行,左邊子串行所有元素都比哨兵元素小,右邊子串行所有元素都比哨兵元素大。然後分別對左右子串行進行快排。

public void quicksort(int

array, int low, int high)

int sentinel = array[low];

intleft = low;

intright = high;

while (left

< right)

while(left

< right && array[left] <= sentinel)

int temp = array[left];

array[left] = array[right];

array[right] = temp;

}int temp = array[low];

array[low] = array[left];

array[left] = temp;

quicksort(array, low, left - 1);

quicksort(array, left + 1, high);

}

思想:一趟氣泡排序為,從第乙個元素開始遍歷,通過每乙個元素跟後面乙個元素的比較,較大者在後面,則一趟排序下來,序列中最大的元素在最後一位,n-1趟冒泡後,則陣列有序。

public

static

void popsort(int

array)

}unpopindex = popindex;

}}

思想:將原序列按照二分分成兩個子串,對子串進行歸併排序後,將兩個子串合併。

public void mergesort(int

array, int

left, int

right)

intmid = (right - left) / 2 + left;

mergesort(array, left, mid);

mergesort(array, mid + 1, right);

int temp = new

int[right - left + 1];

int a = left;

int b = mid + 1;

int count = 0;

while(a <= mid && b <= right)

while(a <= mid)

while (b <= right)

for (int i = 0; i < right - left + 1; i ++ )

}

思想:最大(小)堆保證堆頂元素是佇列中的最大(小)值,通過取堆頂元素,再調整剩下元素的堆狀態,就可以獲得排序後的陣列。

//最小堆排序演算法,先利用原陣列建立乙個堆,也就是通過對非葉子節點的「下潛操作」(與子節點對比,如果子節點較小,則交換),建立起乙個堆,能保證堆頂元素是佇列中最小值。然後每次都取堆頂元素,刪去堆頂元素,並用佇列中最後乙個元素補在堆頂位置,再對堆頂位置進行「下潛操作」,這樣又能保持最小堆的狀態,迴圈操作,就能將原陣列排序

public

static

void heapsort(int

array)

//也可以通過從第乙個元素開始,每乙個元素執行「上潛操作」,來簡歷堆。上潛操作適合在乙個堆的佇列末尾增加元素,調整堆的情況。

// for (int i = 0; i < temparray.length; i ++)

//每次都取出堆頂元素,再用佇列末尾補在堆頂位置,對堆頂位置進行下潛操作,這樣又能保證堆頂元素是最小的啦,再迴圈操作,直至陣列元素全部排序完

for (int i = 0; i < array.length; i ++)

}private

static

void adjustdown(int

array, int index, int maxindex)

if(temp < array[child])

array[(child - 1)/2] = array[child];

child = child * 2 + 1;

}array[(child - 1) / 2] = temp;

}public

static

void adjustup(int

array, int index)

array[index] = array[(index - 1) / 2];

index = (index - 1) / 2;

}array[index] = temp;

}

幾種經典排序演算法的總結

假期即將結束,用最後這兩天溫習一下幾種經典排序演算法,總結一下,如有錯誤,請不吝指出 1.基本概念 1 穩定排序 當待排元素中有相同元素時,排序完後這些相同元素的相對位置與原來一致。例如 1a 2a,5,4,1b 3,2b 排序完後 1a 1b,2a 2b,3,4,5 2 原地排序 指排序時只需要使...

資料結構的幾種經典排序演算法

include include 排序演算法 偽版氣泡排序 void bubblesort int k,int n printf 總共進行了 d次比較,進行了 d次移動!count1,count2 氣泡排序 void bubblesortplus int k,int n printf 總共進行了 d次...

經典的幾種排序方式

所謂排序就是整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。穩定排序與不穩定排序 假設 ki kj 且排序前序列中 ri 領先於 rj 若在排序後的序列中 ri 仍領先於 rj 則稱排序方法是穩定的。若在排序後的序列中 rj 仍領先於 ri 則稱排序方法是不穩定的。例 序列 3 15 8 ...