常見排序演算法(總結)

2021-08-10 08:26:46 字數 3059 閱讀 7430

演算法名

時間複雜度

空間複雜度

穩定性氣泡排序o(

n2) o(

1)不穩定

選擇排序o(

n2) o(

1)不穩定

插入排序o(

n2) o(

1)穩定

歸併排序o(

nlog

n)o(

n)可以優化到o(

1)穩定

快速排序o(

nlog

n)o(

logn

−n) 不穩定

堆排序o(n

logn

) o(

1)不穩定

希爾排序o(

nlog

n)o(

1)不穩定

計數排序o(

n)o(

m)穩定

基數排序o(

n)o(

m)穩定

其中基數排序和基數排序都是基於桶原理的排序(其他排序方法基於比較的排序), 其空間複雜度o(

m)其中, m為桶的個數。 穩定性指的是在排序過程中相同元素的順序是否會被改變,比如, 在乙個陣列中出現兩個連續的元素,若經過排序後這連個元素的順序被改變為,則該排序演算法是不穩定的。

在[0, n-1]的區間內,第乙個數和第二個數比較, 如果前面的數比後面大就交換順序, 然後第二再和第三比較, 依次比較下去, 那麼最大的數就會被放在最後面。然後再對[0, n-2]區間進行相同的操作。氣泡排序的迭代是從後向前的, 陣列的後i個元素會被優先排序。

class bubblesort }}

return a;

}};

在範圍[0, n-1]上找到乙個最小值, 並把它放在位置0上,然後在[1, n-1]的範圍選出最小值放在位置1上,依次進行直到只剩下乙個數,排序就完成了。注意選擇排序的迭代是向後縮小排序範圍的, 也就是前i個元素會優先排序, 著剛好與氣泡排序相反。

class selectionsort 

swap(a, i, min_index);

}return a;

}void swap(int* a, int m, int n)

};

首先是位置0上的數和位置1上的數進行比較,如果位置1上的數更小就和位置0上的數進行交換, 接下來就看位置2上的數,和位置1上的數進行比較,如果位置2上的數小就和1上的數進行交換。交換之後位置1上的數再和位置0上的數進行比較,如果還是跟小,就和位置0上的數進行交換。

class insertionsort 

finger--;}}

return a;

}void swap(int* a, int index1, int index2)

};

讓陣列中的每乙個數單獨成為長度為1的有序區間,然後把相鄰的長度為1 的有序區間進行合併得到長度為2的有序區間。 然後再把相鄰有序區間進行合併,得到最大長度為4的有序區間, 直到讓陣列裡所有的數合併為乙個有序區間,排序結束。每個合併的過程可以通過兩個indexes 來實現。

//歸併排序的遞迴實現

class mergesort

void division(int* a, int left, int right)

int mid = (left+right)/2;

division(a, left, mid);

division(a, mid+1, right);

merge(a, left, mid, right);

}void merge(int* a, int left, int mid, int right)

while(r<=right)

for(int i=0;iclass quicksort

void division(int* a, int

left, int

right)

}void swap(int* a, int index1, int index2)

int partition(int* a, int

left, int

right)

index++;

}return initial;

}};

先把陣列建立為乙個大小為n的大根堆, 堆頂是整個陣列的最大值, 將堆頂元素和堆得最後乙個數進行交換,然後把最大值脫離出整個堆結構,放在陣列最後的位置。然後對前面n-1大小的堆,從堆頂位置進行大根堆的調整,和上一次步驟相同,分離出最大值。直到只剩下乙個數,排序過程結束。

class heapsort 

void maxheap(int* a, int n, int init, int end)

else

break;

}a[parent] = val;

}int* heapsort(int* a, int n)

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

return a;

}};

改良的排序演算法,改變了插入排序的步長。

class

shellsort

int* shellsort(int* a, int n)

else}}

}return a;

}};

先建立排序區間內的桶,然後讓排序陣列裡的數對應進桶,然後從最小桶開始依次倒出,倒出順序就是排序順序。

#include

class countingsort }}

return a;

}};

根據個位數入桶,然後依次倒出;再根據十位數入桶,依次倒出,直到排序陣列的最高位入桶並倒出後排序結束。

class radixsort 

return a;

}void distribute(int* a, int n, int count)

int index =0;

for(int i=0;i<10;i++)}}

};

常見排序演算法總結

sort.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std const int len 100 class csort 注意此處應該有分號 csort csort length len 建構函式,初始化陣列 arr j 1 ...

常見排序演算法總結

1.氣泡排序 蠻力法 基本思想 兩兩比較相鄰記錄,如果反序側交換,直到沒有反序的記錄為止。如果是正序排,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。時間複雜度 o n n void bubblesort int a,int n 優化的氣泡排序 if flag 0 break...

常見排序演算法總結

我們在平時的開發中,排序演算法可以說是最常用的演算法之一,不同的排序演算法,有著不一樣的效能消耗,雖說前端開發對演算法的要求沒有那麼高,但是對於一些常見的演算法,我們還是要掌握的,它屬於乙個開發者的基本功,今天,我們就來總結一下常見的排序演算法,請看下面這張表 下面排序都以由小到大排序為目的 1 基...