本文介绍复杂度为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]);
}
}