本文分别介绍了直接插入排序,希尔排序,二分插入排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序的思想与代码。
1.插入排序
思想:将一个数组分为有序区和无序区,有序区一开始无任何元素,然后遍历每轮不停从无序区取得元素放入有序区的位置当中即可。
复杂度与稳定性:
最好情况 | 最坏情况 | 平均复杂度 | 空间复杂度 | 算法稳定性 |
---|---|---|---|---|
o(n) | o( |
o( |
o(1) | 稳定 |
代码实现:
//直接插入排序
void insertSort(int a[],int n) {
int i,j;
//a[0]视为哨兵
for (i=2;i<=n;i++) {
//后面元素小于前面的元素,不规则开始插入
if(a[i-1]>a[i]) {
a[0] = a[i]
for (j=i-1;a[0]<a[j];j--) {
a[j+1] = a[j];
}
a[j+1] = a[0];
}
}
}
2.二分(折半)插入排序
思想:基于上面的插入排序,在选取元素插入位置时利用二分查找的思想,这样可以减少对比的次数。
复杂度与稳定性:
最好情况 | 最坏情况 | 平均复杂度 | 空间复杂度 | 算法稳定性 |
---|---|---|---|---|
o(n) | o( |
o( |
o(1) | 稳定 |
代码实现:
void BInsertSort(int a[],int n) {
int i,j,mid,high,low;
for (i=2;i<=n;i++) {
a[0] = a[i];
low=1;high=i-1;
//注意在这里是小于等于号
while(low<=high) {
mid = (low+high)/2;
if(a[mid]>a[0]) {
high = mid-1;
} else {
low = mid+1;
}
}
for (j=i-1;j>=high+1;j--) {
a[j+1] = a[j