直接插入排序
思想:
1. 将待排序序列分为有序区和无序区
2. 第一个元素默认作为有序区域,依次遍历后面无序区的元素,将其插入到有序区
性能
* 时间复杂度:O(n2)
* 空间复杂度:O(1)
* 稳定性:稳定的
代码
void insertSort(int a[],int n){
//i从1开始,第一个默认有序
for (int i = 1; i<n; i++) {
//保存当前遍历的无序序列的元素
int temp = a[i];
//记录当前位置,因为该位置之前的为有序,之后的为无序,需要将该元素插入到有序序列中去,而且要插到合适的位置,就需要进行比较
int j = i;
//移动从而选择合适的位置来插入,有序序列从后往前遍历,如果有序,那么就一直往前走,知道找到比他小的,跳出循环,赋值
while (j>0&&a[j-1]>temp) {
a[j]=a[j-1];
j--;
}
//找到合适位置赋值
a[j] = temp;
}
}
希尔排序
思想:
1. 将待排序序列按照根据递增量划分为不同的子序列
2. 每一个子序列进行直接插入
性能
* 时间复杂度:O(n^1.5)
* 空间复杂度: O(1)
* 稳定:不稳定:因为不知道划分到哪一个组里面去了
代码
//希尔排序
void shellSort(int a[],int n){
//外部加一个循环,表示递增量
for (int d = n/2; d>0; d = d/2) {
//序列元素发生改变,每一个子序列的下一个元素在当前下标+d,而不是1,所以i从d开始
for (int i = d; i<n; i++) {
//记录当前遍历的子序列的无序区的元素,一次插入有序序列
int temp = a[i];
int j = i;
//,子序列有序序列的第一个下标为d,不再是1,上一个元素的位置为当前下表-d
while (j>=d&&a[j-d]>temp) {
a[j] = a[j-d];
j -= d;
}
a[j] = temp;
}
}
}