各種排序演算法分析與比較

2021-07-29 14:10:18 字數 2335 閱讀 7179

1.直接插入排序

每一趟將乙個待排序的元素作為關鍵字,按照其關鍵字的大小插入到已經排好的部分序列的適當位置上。平均時間複雜度為o(n2),空間複雜度為o(1)。

void insertsort(int r, int n)

r[j+1] = temp;

}}

2.氣泡排序

平均時間複雜度為o(n2),空間複雜度為o(1)

void bubblesort(int r, int n)

} if (flag == 0)

return;

}}

3.快速排序

快速排序以樞軸為中心,將序列分成兩部分。關鍵是樞軸的劃分。

時間複雜度:最好的情況下為o(nlogn),最壞為o(n2)

空間複雜度:o(log2n)

遞迴演算法:

void quicksort(int r, int low, int high)

幾種劃分演算法:

1.從後往前掃瞄直到小於樞軸的位置j,將r[j]交換到i的位置;從i開始往後掃瞄,直到遇到大於樞軸的位置i,把r[i]交換到j的位置。

int partition(int r, int low, int high)

r[low] = pivot;

return low;

}

2.從前往後掃瞄,遇到小於樞軸的值,則遞增small值,如果當前下標與small不相等,則交換,保證small左邊的元素都小於樞軸。

int partition(int data, int start, int end)

} swap(r[low], r[j]);

return j;

}

4.堆排序

堆是一種資料結構,可以把堆看成完全二叉樹,這棵完全二叉樹滿足:任何乙個非葉節點的值都不大於(或不小於)其左右孩子節點的值。若父節點大於孩子節點,則叫大頂堆,父節點小於孩子節點,則叫小頂堆。

堆排序的主要操作是將序列調整為堆。

時間複雜度:o(n log2n);空間複雜度:o(1)

void shift(int r, int low, int high)

if (temp < r[j])

else

break;

} r[i] = temp;

}void heapsort(int r, int n)

for (i = n-1; i >= 1; --i)

}

4.二路歸併排序

歸併排序的時間複雜度和初始序列無關,平均情況下為o(n log2n),最好情況下為o(nlog2n),最壞情況下也為o(nlog2n)。

空間複雜度:因歸併排序需要轉存整個待排序列,因此空間複雜度為o(n)

void merge(int r, int temparray, int low, int mid, int high)

while (i <= mid)

temparray[k++] = r[i++];

while (j <= high)

temparray[k++] = r[j++];

for (int i = low; i <= high; ++i) }

void mergesort(int r,int temparray, int low, int high)

}void mergesort(int r, int n)

5.計算排序

適用於元素的取值範圍比較小的情況。

1>統計每個元素的個數

2>統計每個元素比自身小的元素個數

template void countingsort(type array, int low, int high, int range)//range為元素的取值範圍

for (int i = low; i <= high; ++i)

for (int i = 1; i <= range; ++i)

for (int i = high; i >= low; --i)

int i = low;

while (i <= high)

delete result;

delete valuecount;

}

各種排序演算法的分析與比較

直接插入排序 每次取乙個記錄插入到已經排好序的有序表中,得到乙個新的有序表。在插入過程中為了防止下標出界,需要在r 0 處加入乙個監視哨。該演算法的時間複雜度為o def insertsort l l.insert 0,0 插入監視哨,c初值為0 for i in range 2,len l 第乙個...

各種排序演算法比較

花了很長時間終於把排序的基礎學了一下,這段時間學了很多東西,總結一下 學的排序演算法有 插入排序,合併排序,氣泡排序,選擇排序,希爾排序,堆排序,快速排序,計數排序,基數排序,桶排序 沒有實現 比較一下學習後的心得。我不是很清楚他們的時間複雜度,也真的不知道他們到底誰快誰慢,因為書上的推導我確實只是...

各種排序演算法比較

排序相關的演算法複雜度分析 下邊分別實現下各個演算法 簡單選擇排序 1 簡單選擇排序 2void select sort int a,intn 3 16 17swap a i a index 18 19 這裡簡單選擇排序之所以不穩定是因為交換的時候會打亂順序,例如 5,4,5,1,6。第一次交換後會...