排序算法—比较排序之插入排序及其优化
2018-02-16 12:36
295 查看
插入排序:能够提前终止,在处理近乎有序的元素时,性能很好,在近乎有序的元素中是近乎O(n)的排序算法;
在确实每个元素的位置之前,该元素前面的所有元素都是有序的,将现在需要确认位置的元素插入当前面有序的队列中,通过移动实现,插入排序的原理是访问过的部分是有序的。
基本实现:
//将当前处理的数据插入到有序表中 得到一个新的 数据加一的有序表
void insert_sort(int* a,int n) {
for (int i = 1; i < n; i++) {//默认只有一个数据的表是有序的 则从下标1的数据开始插入到前面的有序表中
for (int j = i; j >=0&& a[j] < a[j-1]; j--) {//将数据插入到有序表中
_swap(&a[j], &a[j - 1]);
}
}
}
优化一:使用赋值操作代替交换操作
//插入排序优化1 只在内层循环交换一次数据 其他都为赋值操作
void insert_sort1(int* a, int n) {
for (int i = 1; i < n; i++) {//默认只有一个数据的表是有序的 则从下标1的数据开始插入到前面的有序表中
int target = a[i];//记录当前需要往前插入的数据
int j = i ;
while (j > 0 && target < a[j - 1]) {
a[j] = a[j - 1];//将大于要插入的数据的值往后移移位 空出应该插入的位置
j--;
}
a[j] = target;
}
}
在确实每个元素的位置之前,该元素前面的所有元素都是有序的,将现在需要确认位置的元素插入当前面有序的队列中,通过移动实现,插入排序的原理是访问过的部分是有序的。
基本实现:
//将当前处理的数据插入到有序表中 得到一个新的 数据加一的有序表
void insert_sort(int* a,int n) {
for (int i = 1; i < n; i++) {//默认只有一个数据的表是有序的 则从下标1的数据开始插入到前面的有序表中
for (int j = i; j >=0&& a[j] < a[j-1]; j--) {//将数据插入到有序表中
_swap(&a[j], &a[j - 1]);
}
}
}
优化一:使用赋值操作代替交换操作
//插入排序优化1 只在内层循环交换一次数据 其他都为赋值操作
void insert_sort1(int* a, int n) {
for (int i = 1; i < n; i++) {//默认只有一个数据的表是有序的 则从下标1的数据开始插入到前面的有序表中
int target = a[i];//记录当前需要往前插入的数据
int j = i ;
while (j > 0 && target < a[j - 1]) {
a[j] = a[j - 1];//将大于要插入的数据的值往后移移位 空出应该插入的位置
j--;
}
a[j] = target;
}
}
相关文章推荐
- 主要排序算法的比较及其优化
- 冒泡排序,选择排序,插入排序,快速排序的比较及优化
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 排序算法-选择排序和插入排序比较(待续未完)
- 三个基本排序算法执行效率比较(冒泡排序,选择排序和插入排序)
- 快速排序的优化及其与qsort的比较
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- 排序算法之 插入排序、希尔(shell)排序 及其时间复杂度和空间复杂度
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
- 算法—比较两种排序算法:选择排序和插入排序(详细)
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- 各种排序算法的实现及其比较
- 冒泡排序,快速排序,插入排序以及二叉树查找的O级时间的比较
- 经典排序之选择、冒泡、插入排序与系统排序的用时比较(Java)
- (巩固基础篇)排序算法:①插入排序②希尔排序③冒泡排序④选择排序⑤快速排序
- c语言中冒泡排序、插入排序、选择排序算法比较
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 各种排序算法的实现及其比较
- 排序算法之插入排序及其改进
- 选择排序及其优化