直接插入排序
2017-04-25 23:10
211 查看
直接插入排序是插入排序的一种。记录Array[0..i-1]已经有序,将待排序记录Array[i]插入到上述序列中的适当位置,使新序列也有序。
时间复杂度:直接插入排序时所需进行的关键字的比较次数和移动次数约为n^2/4,时间复杂度为O(n^2)。
空间复杂度:就地排序,空间复杂度为O(1)。
稳定性:稳定。
改进:从减少比较和移动次数出发考虑,对半插入法和2-路插入法。对半插入法,即在插入第i个元素时不是顺序寻找插入位置,而是采用对半的方法,若记录是用数组存储的,对半插入排序法可以减少关键字的比较次数,但记录的移动次数不变,而对于链式存储方式不能使用对半的方法寻找插入位置。直接插入排序的另一种改进方法是希尔排序。
#include<stdio.h> #include<stdlib.h> void InsertSort(int *array, int n) { int i, j, temp; for (i = 1; i < n; i++) { if (*(array + i) < *(array + i - 1)) { temp = *(array + i); j = i - 1; do { *(array + j + 1) = *(array + j); j--; } while (temp < *(array + j)); *(array + j + 1) = temp; } } } void main() { int i; int array[10] = { 12,3,5,34,7,23,42,81,96,47 }; printf("待排序的数组为:"); for (i = 0; i < 10; i++) printf("%d ", *(array + i)); getchar(); InsertSort(array, 10); printf("\n直接插入排序后的数组:"); for (i = 0; i < 10; i++) printf("%d ", *(array + i)); printf("\n\n"); }
时间复杂度:直接插入排序时所需进行的关键字的比较次数和移动次数约为n^2/4,时间复杂度为O(n^2)。
空间复杂度:就地排序,空间复杂度为O(1)。
稳定性:稳定。
改进:从减少比较和移动次数出发考虑,对半插入法和2-路插入法。对半插入法,即在插入第i个元素时不是顺序寻找插入位置,而是采用对半的方法,若记录是用数组存储的,对半插入排序法可以减少关键字的比较次数,但记录的移动次数不变,而对于链式存储方式不能使用对半的方法寻找插入位置。直接插入排序的另一种改进方法是希尔排序。
相关文章推荐
- 排序算法——直接插入排序
- 插入排序一(直接插入排序)
- 直接插入排序
- Java实现插入排序之直接插入排序
- 排序算法-直接插入排序
- 直接插入排序
- 直接插入排序
- 直接插入排序和希尔排序
- 直接插入算法排序
- 内部排序思想、直接插入排序法
- 直接插入排序
- 排序之直接插入排序(Straight Insertion Sort)
- 排序算法(1) —— 直接插入排序及其改进
- Java排序算法(六):直接插入排序
- 排序-插入类排序-直接插入排序
- 输出直接插入排序每趟比较的过程
- PHP 插入排序 -- 直接插入排序
- 直接插入排序
- 【排序一】插入排序(直接插入排序&&希尔排序)
- 第16周项目1-验证算法(3)冒泡排序 直接插入排序