本文介紹複雜度爲O(N^2)的三種排序:冒泡、插入以及交換,還有插入排序的變種希爾排序;
冒泡排序:(時間複雜度固定,恆爲O(N^2)
void BubbleSort(int a[], int n)
{
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (a[i] > a[i+1])
swap(a[i], a[i+1]);
}
帶flag標誌的改進冒泡排序:
void BubbleSort2(int a[], int n)
{
for (int i = 0; i < n-1; i++)
{
bool flag = false;
for (int j = 0; j < n-i-1; j++)
{
if (a[j] > a[j+1])
{
swap(a[i], a[j+1]);
flag = true;
}
}
if (!flag) break;
}
}
插入排序:
void InsertSort(int a[], int n)
{
for (int i = 1; i < n; i++)
{
int key = a[i];
int j = i-1;
while (j >= 0 && a[j] > a[i]) j--;
for (int k = j+1; k < i; k++) a[k+1] = a[k];
a[j+1] = key;
}
}
插入排序的變種--希爾排序:
。。。
選擇排序:不穩定排序
void SelectionSort(int a[], int n)
{
for (int i = 0; i < n-1; i++)
{
int index = i;
for (int j = i+1; j < n; j++)
{
if (a[index] > a[j])
index = j;
}
if (i != index) swap(a[i], a[index]);
}
}