插入排序
2014-04-14 16:32
330 查看
有两种简单排序算法分别是插入排序和选择排序,两个都是数据量小时效率高。实际中插入排序一般快于选择排序,由于更少的比较和在有差不多有序的集合表现更好的性能。但是选择排序用到更少的写操作,所以当写操作是一个限制因素时它被使用到。
常常被用作为复杂算法的一部分,希尔排序是插入排序的一种变体对数据大时更有效。
优点:
1.实现简单;
2.对于少量数据效率高;
3.对于差不多已经排好顺序的集合效率高,时间复杂度为O(n+d),d是错位数字的个数;
43比起其他简单二次(O(n^2))算法(选择排序,冒泡排序),他的最好的情况是O(n)(集合接近顺序排好);
5.稳定,不会改变相等数原有的顺序;
插入排序类似于选择排序,不同之处是插入排序是一个元素一个元素地往有序序列中插入,而选择排序则是在无序序列中选择最大(最小)元素放入有序队列末尾。一个主要操作有序队列,一个则是无序队列。这样就导致选择排序每次都要遍历一次无序队列,而插入排序则不需要遍历整个有序队列,只需要遍历到该元素应有的位置即可,这样就使得基本有序的队列的复杂度为O(n).
但同时这会导致插入排序用到更多的写操作,因为内部循环时他对数组进行大量的移位操作,大家知道移位操作对于数组是非常低效率的。而选择排序因为每次添加元素都是添加在末尾,所以不需要移位操作。
#include <stdio.h>
void insertSort(int arr[], int size)
{
int pos1 = 0, pos2 =0;
for(pos1 = 1; pos1 < size; ++pos1)
{
int temp = arr[pos1];
for(pos2 = pos1-1; pos2 >= 0; --pos2)
{
if( arr[pos2] > temp)
{
arr[pos2+1] = arr[pos2];
}
else
{
break;
}
}
arr[pos2+1] = temp;
}
}
int main()
{
int arr[] = {-3,-5,0,-2,5,1,6,8,7,-9,20};
int i = 0;
insertSort(arr, 11);
for(i = 0; i < 11; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
$(".MathJax").remove();
常常被用作为复杂算法的一部分,希尔排序是插入排序的一种变体对数据大时更有效。
优点:
1.实现简单;
2.对于少量数据效率高;
3.对于差不多已经排好顺序的集合效率高,时间复杂度为O(n+d),d是错位数字的个数;
43比起其他简单二次(O(n^2))算法(选择排序,冒泡排序),他的最好的情况是O(n)(集合接近顺序排好);
5.稳定,不会改变相等数原有的顺序;
插入排序类似于选择排序,不同之处是插入排序是一个元素一个元素地往有序序列中插入,而选择排序则是在无序序列中选择最大(最小)元素放入有序队列末尾。一个主要操作有序队列,一个则是无序队列。这样就导致选择排序每次都要遍历一次无序队列,而插入排序则不需要遍历整个有序队列,只需要遍历到该元素应有的位置即可,这样就使得基本有序的队列的复杂度为O(n).
但同时这会导致插入排序用到更多的写操作,因为内部循环时他对数组进行大量的移位操作,大家知道移位操作对于数组是非常低效率的。而选择排序因为每次添加元素都是添加在末尾,所以不需要移位操作。
#include <stdio.h>
void insertSort(int arr[], int size)
{
int pos1 = 0, pos2 =0;
for(pos1 = 1; pos1 < size; ++pos1)
{
int temp = arr[pos1];
for(pos2 = pos1-1; pos2 >= 0; --pos2)
{
if( arr[pos2] > temp)
{
arr[pos2+1] = arr[pos2];
}
else
{
break;
}
}
arr[pos2+1] = temp;
}
}
int main()
{
int arr[] = {-3,-5,0,-2,5,1,6,8,7,-9,20};
int i = 0;
insertSort(arr, 11);
for(i = 0; i < 11; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
$(".MathJax").remove();
相关文章推荐
- 《算法导论》中广度优先搜索的实现 c++
- 单链表的反转 c++
- 线性表(顺序表)相关操作的c++代码
- 各种排序
- Prim算法和Kruskal算法
- 算法的时间复杂度和空间复杂度
- 排序算法之归并排序
- 排序算法之插入排序
- 排序算法之冒泡排序
- 排序算法-10-算法-分治法(Divide and Conquer)
- 数据结构-08-集合(Set)-哈希表(Hash)-图(Map)
- 数据结构-07-栈(Stack)
- 数据结构-06-堆(Heap)
- 数据结构-05-队列(Queue)
- 数据结构-04-霍夫曼压缩(Huffman Compression)
- 数据结构-03-二叉树(Binary Tree)
- 快速排序算法——java语言
- 这是顺序表的操作1.删除最小元素,空元素由最后一个填补,删除给定x的所有元素删除s-t间的所有元素
- 基本概念和基础知识
- 华为OJ—四则运算