排序算法 | 最坏情况下时间复杂度 | 最好情况下时间复杂度 | 平均时间 | 空间复杂度 | 稳定性 |
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
希尔排序 | O(n2) | O(n) | O(n1.3) | O(1) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 稳定 |
快速排序 | O(n2) | O(nlog2n) | O(nlog2n) | O(nlog2n) | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |
冒泡排序
void BubbleSort(int a[], int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
if (a[j] > a[j + 1])
{
int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp;
}
}
}
选择排序
void SelectSort(int a[], int n)
{
for (int i = 0; i < n - 1; i++)
{
int min = i;
for (int j = i + 1; j < n; j++)
if (a[j] < a[min]) min = j;
if (min != i)
{
int temp = a[i]; a[i] = a[min]; a[min] = temp;
}
}
}
插入排序
void InsertSort(int a[], int n)
{
for (int j = 1; j < n; j++)
{
int key = a[j];
int i = j - 1;
while (i >= 0 && a[i] > key)
{
a[i + 1] = a[i];
i = i - 1;
}
a[i + 1] = key;
}
}
希尔排序
void ShellSort(int a[], int n)
{
int gap;
for (gap = 3; gap > 0; gap--)
{
for (int i = 0; i < gap; i++)
{
for (int j = i; j < n; j = j + gap)
{
cout << "a[" << j << "]:" << a[j] << " ";
int key = a[j];
int k = j - gap;
while (k >= 0 && a[k] > key)
{
a[k + gap] = a[k];
k = k - gap;
}
a[k + gap] = key;
}
cout << endl;
}
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
}
归并排序
void Merge(int A[], int p, int q, int r)
{
int i, j, k;
int n1 = q - p + 1;
int n2 = r - q;
int *L = new int[n1 + 1];
int *R = new int[n2 + 1];
for (i = 0; i < n1; i++)
L[i] = A[i + p];
for (j = 0; j < n2; j++)
R[j] = A[j + q + 1];
L[n1] = INT_MAX;
R[n2] = INT_MAX; //若没有L[n1],L[n2],会有内存中的数据出现在排序中
i = 0; j = 0;
for (k = p; k <= r; k++)
{
if (L[i] <= R[j])
A[k] = L[i++];
else
A[k] = R[j++];
}
delete[] L;
delete[] R;
}
void MergeSort(int A[], int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
//递归过程,二路归并排序递归过程
MergeSort(A, p, q);
MergeSort(A, q + 1, r);
//归并
Merge(A, p, q, r);
}
}
快速排序
int partition(int a[], int p, int r) //r表示数组的长度
{
int x = a[r - 1]; //以最后一个数为基准
int i = p - 1;
for (int j = p; j < r - 1; j++)
{
if (a[j] <= x)
{
i++;
if (i == j)
continue;
int temp = a[i]; a[i] = a[j]; a[j] = temp;
}
}
int temp = a[i + 1]; a[i + 1] = a[r - 1]; a[r - 1] = temp; //当j遍历完p到r-2时,交换a[r-1]与a[i+1]
return i + 1;
}
void QuickSort(int a[], int p, int r)
{
if (p < r - 1)
{
int q = partition(a, p, r);
QuickSort(a, p, q);
QuickSort(a, q + 1, r);
}
}
计数排序
void CountingSort(int a[], int n, int k) //n个输入元素,每个都是0-k区间的一个整数
{
int *c = new int[k + 1];
int *b = new int[n];
for (int i = 0; i < k + 1; i++)
c[i] = 0;
for (int j = 0; j < n; j++)
c[a[j]] = c[a[j]] + 1; //共有c[a[j]]个数与a[j]相同
for (int i = 1; i < k + 1; i++)
c[i] = c[i] + c[i - 1]; //小于等于a[j]的数共有c[i]个
for (int j = 0; j < n; j++)
{
b[c[a[j]] - 1] = a[j];
c[a[j]] = c[a[j]] - 1;
}
delete[]c;
delete[]b;
}