1 插入排序
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键字码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
2 直接插入排序
2.1 基本思想
当插入第 i ( i > = 1 ) i(i>=1) i(i>=1)个元素时,前面的array[0]、array[1]、…、array[i-1]已经排好序,此时用array[i]的排序码与array[i-1]、array[i-2]、…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。
2.2 算法示意图
2.3 程序代码
#include<stdio.h>
#include<stdlib.h>
/*直接插入排序
*/
void insertSort(int* arr, int n) {
//假设第一个数据有序
//未插入的数据[1,n)
for (int i = 1; i < n; i++) {
int end = i - 1;
int data = arr[i];
while (end >= 0 && arr[end] > data) {
//大的数据向后移动
arr[end + 1] = arr[end];
end--;
}
arr[end + 1] = data;
}
}
2.4 代码验证
void testInsertSort() {
int arr[] = { 9 ,1,2,5,7,4,8,6,3,5 };
int n = sizeof(arr) / sizeof(arr[0]);
insertSort(arr , n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int main() {
testInsertSort();
return 0;
}
运行结果如下:
2.5 直接插入排序的特性
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( 1 ) O(1) O(1),它是一种稳定的排序算法
- 稳定性:稳定
3 希尔排序
3.1 基本思想
希尔排序法又称缩小增量法。希尔排序的基本思想是:先选定一个整数n,把待排序文件中所有记录分成n个组,所有距离为n的记录分在同一组内,并对每一组内的记录进行排序。然后,重复上述分组和排序的工作,当n=1时,所有记录在统一组内排好序。
3.2 算法示意图
- n=3时:
- n=2时:
- n=1时:
3.3 程序代码
#include<stdio.h>
#include<stdlib.h>
/*希尔排序
*/
void shellSort(int* arr, int n) {
int gap = n;
while (gap > 1) {
gap = gap / 3 + 1 ;
//未排序数组[gap , n)
for (int i = gap; i < n; i++) {
int end = i - gap;
int data = arr[i];
while (end >= 0 && arr[end] > data) {
arr[end + gap] = arr[end];
end = end - gap;
}
arr[end + gap] = data;
}
}
}
3.4 代码验证
void testShellSort() {
int arr[] = { 9 ,1,2,5,7,4,8,6,3,5 };
int n = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int main() {
testShellSort();
return 0;
}
3.5 希尔排序的特性
- 希尔排序是对直接插入排序的优化
- 当
gap>1
时都是预排序,目的是让数组更接近于有序。当gap == 1
时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比 - 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O ( N 1.3 − N 2 ) O(N^{1.3}-N^2) O(N1.3−N2)
- 稳定性:不稳定