演算法名
時間複雜度
空間複雜度
穩定性氣泡排序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 基...