时间复杂度和稳定性都在代码块里
直接插入排序的实现:
#include<iostream>
using namespace std;
//直接插入排序 最好时间复杂度为O(n)
//平均和最坏都是O(n^2),不稳定 适用于顺序存储和链式存储
int main() {
int n, i, j, temp;
cin >> n;
//创建长度为n的数组
int *p = new int[n];
//输入数组的每一个元素的值
for (i = 0; i < n; i++)
cin >> p[i];
for ( i = 1; i < n; i++){
temp = p[i];
for (j = i - 1; p[j] > temp; j--)
p[j + 1] = p[j];
p[j + 1] = temp;
}
//输出数组元素
for (i = 0; i < n; i++)
cout << p[i] << " ";
cout << endl;
system("pause");
return 0;
}
折半插入排序:
#include<iostream>
using namespace std;
//折半插入 稳定算法 只适用于顺序存储
int main() {
int n, i, j, temp;
cin >> n;
//创建长度为n的数组
int *p = new int[n];
//输入数组的每一个元素的值,从零开始存储
for (i = 0; i < n; i++)
cin >> p[i];
for (i = 1; i < n; i++) {
temp = p[i];
//二分查找
int low = 0, high = i - 1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (p[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; j--)
p[j + 1] = p[j];
//low也可以实现排序,观察上的移动的最后一个元素位置
//p[j + 1] = temp;
p[high+1] = temp;
}
//输出数组元素
for (i = 0; i < n; i++)
cout << p[i] << " ";
cout << endl;
system("pause");
return 0;
}
希尔排序:
#include<iostream>
using namespace std;
//希尔排序 平均时间复杂度为O(n^1.3)
//不稳定 适用于顺序存储
void ShellSort(int *a, int len)
{
int i, j;
for (int dk = len / 2; dk >= 1; dk /= 2)
//i++表示全部分组同时进行直接插入排序
for ( i = dk+1; i <=len ; i++)
if (a[i]<a[i-dk])
{
//哨兵
a[0] = a[i];
for ( j = i-dk;j>0&&a[0]<a[j] ; j-=dk)
a[j + dk] = a[j];
a[j + dk] = a[0];
}
}
int main() {
int n, i, j, temp;
cin >> n;
//创建长度为n+1的数组
int *p = new int[n + 1];
//输入数组的每一个元素的值,从1开始存储
for (i = 1; i <= n; i++)
cin >> p[i];
ShellSort(p, n);
//输出数组元素
for (i = 1; i <= n; i++)
cout << p[i] << " ";
cout << endl;
system("pause");
return 0;
}