void Bubble_Sort(int A[],int N)
{
for(int i=0;i<N;++i)
{
for(int j=0;j<i;++j)
{
if(A[j]>A[j+1])
{
int temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
}
}
2. 插入排序,插入排序原理,就像我們平時打撲克,整理牌一樣,抓一張,跟手裏最右面一張比,比第一張小,第一張向右移動一下,然後再跟第二張比,找到合適位置,就將其插進去,這種算法也是屬於簡單算法的一種,最壞的時間複雜度爲n^2
,也是一種效率比較低的排序,然而,插入排序的意義,在我理解,應該是作爲希爾排序的基礎,該算法代碼如下:void insert_sort(int ElementType[],int N)
{
for (int i = 1; i < N; ++i)
{
int temp = ElementType[i];
for (int j = i; j>0 && ElementType[j - 1] > temp; --j)
{
ElementType[j] = ElementType[j - 1];
ElementType[j - 1] = temp;
}
}
}
3.選擇排序,選擇排序 的原理是,從i開始,到最後,找最小的,交換最小的和i位置的數據,i就是第一次循環的循環控制變量,這種排序最壞時間複雜度也是n^2,選擇排序是作爲堆排序的基礎,由選擇排序可以演化爲堆排序,實現代碼如下:
int ScanForMin(int ElementType[], int start,int end)
{
int result = 0;
int temp = ElementType[0];
for (int i = start; i < end; ++i)
{
if (ElementType[i] < temp)
{
temp = ElementType[i];
result = i;
}
}
return result;
}
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void selection_sort(int ElementType[], int N)
{
for (int i = 0; i < N; ++i)
{
int MinPosition = ScanForMin(ElementType, i, N-1 );
if (MinPosition!=i)
swap(ElementType[i], ElementType[MinPosition]);
}
}
希爾排序,希爾排序的原理是,先比較相隔N個的元素的大小,然後縮小N的值,再來一遍,比如,第一次,每個五個比一次,第二次,每隔三個比一次,最後一次,再比較相鄰兩個,比較相鄰兩個的時候,整個數組已經基本有序了,當然理想情況下是基本有序,存在一種情況,前幾次排序並沒有使順序發生任何變化,白做了幾次循環,使得時間複雜度異常大,超過冒泡和插入,所以,SedgeWick提出一種希爾增量,增量使用4^i-3*2^i+1這個公式 算出,使最壞時間複雜度降爲n^(4/3),而平均時間複雜度只是個理論值爲:n^(7/6)但是,這種希爾排序,在大量數據排序時,確實是效率相當高的,SedgeWick增量希爾排序實現代碼如下:
int sedgewick[] = { // Sedgewick增量 4^i-3*2^i+1
1073643521, 603906049, 268386305, 150958081, 67084289,
37730305, 16764929, 9427969, 4188161, 2354689,
1045505, 587521, 260609, 146305, 64769,
36289, 16001, 8929, 3905, 2161,
929, 505, 209, 109, 41,
19, 5, 1, 0 };
void Shell_Sort(int ElementType[], int N)
{
for (int *i = sedgewick; *i > N;i++)
{
for (int j = 1; j < N; ++j)
{
int temp = ElementType[j];
for (int k = j; k>0 && ElementType[k - 1]>temp; --k)
{
ElementType[k] = ElementType[k - 1];
ElementType[k - 1] = temp;
}
}
}
}