插入排序
2015-06-02 22:42
232 查看
今天学习了一下插入排序:
插入排序类似我们平时打扑克牌时整理牌。@代表移动后空出来的位置
比如我们先拿到一个10,这时手里只有一张牌,本身就是有序的,所以插入排序应该从第二个元素开始排序
【10】
下次我们拿到了5,这时5是待排序的关键字,我们先和手里已有的牌10,比较,5<10,我们就可以把10向后移动【@,10】,然后把5放在原来10的位置上,
【5,10】
再下次我们拿到了3,我们手里本身有的牌时【5,10】,他们是有序的,我们为了放入3,我们先跟10比较,3<10,我们就把10向后移动一个位置【5,@,10】,然后3再和5比较,3<5,我们把5也向后移动一个位置【@,5,10】,此时前面再没有牌了,我们就把3放入第一个位置就可以。
【3,5,10】
最后我们拿到的牌是4,我们先和前面已有序的牌【3,5,10】从后向前挨个的比较。先和【10】比较,4<10,
所以10向后移动一个位置【3,5,@,10】,然后再和5比较,4<5,所以5也向后移动一个位置
【3,@,5,10】,最后和3比较,4>3,循环结束,4应该放在原来5所在的位置。
【3,4,5,10】
下面是一个简单的测试代码:
插入排序类似我们平时打扑克牌时整理牌。@代表移动后空出来的位置
比如我们先拿到一个10,这时手里只有一张牌,本身就是有序的,所以插入排序应该从第二个元素开始排序
【10】
下次我们拿到了5,这时5是待排序的关键字,我们先和手里已有的牌10,比较,5<10,我们就可以把10向后移动【@,10】,然后把5放在原来10的位置上,
【5,10】
再下次我们拿到了3,我们手里本身有的牌时【5,10】,他们是有序的,我们为了放入3,我们先跟10比较,3<10,我们就把10向后移动一个位置【5,@,10】,然后3再和5比较,3<5,我们把5也向后移动一个位置【@,5,10】,此时前面再没有牌了,我们就把3放入第一个位置就可以。
【3,5,10】
最后我们拿到的牌是4,我们先和前面已有序的牌【3,5,10】从后向前挨个的比较。先和【10】比较,4<10,
所以10向后移动一个位置【3,5,@,10】,然后再和5比较,4<5,所以5也向后移动一个位置
【3,@,5,10】,最后和3比较,4>3,循环结束,4应该放在原来5所在的位置。
【3,4,5,10】
下面是一个简单的测试代码:
1 #include<stdio.h> 2 void InsertSort(int A[],int len);//插入排序函数声明 3 void PRINT(int A[],int len);//数组打印函数声明 4 int main() 5 { 6 int a[8]={7,5,1,0,3,9,4,2};//测试数组 7 PRINT(a,8);//排序前打印 8 InsertSort(a,8);//调用插入排序进行排序 9 PRINT(a,8);//再次打印出已排序好的数组 10 11 return 0; 12 } 13 14 void PRINT(int A[],int len)//输出数组元素 15 { 16 int i; 17 for(i = 0;i<len;i++) 18 { 19 printf("%d->",A[i]); 20 } 21 22 printf("\n"); 23 24 25 void InsertSort(int A[],int len)//插入排序 26 { 27 int i,j; 28 for(i =1;i<len;i++)//i=1从第二个元素开始排序,只有一个元素时本身就是有序的 29 { 30 j = i-1;//已经排好序的前j个元素 31 int key = A[i];//key保存待排序的元素 32 while(j>=0 && A[j]>key)//只要前面还有排好的元素(j>=0)并且排好序的元素大于待排序的关 33 { //键字就一直循环 34 A[j+1] = A[j];//把大于带排序关键字的元素向后移动 35 j--;//继续向前查找大于待排序关键字的元素 36 } 37 A[j+1] = key;//待排序关键字放入正确位置。如果换成A[j] = key;可以吗?不可以。为什么? 38 } 39 }
相关文章推荐
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- Oracle中插入特殊字符:&和'的解决方法汇总
- 将数据插入到MySQL表中的详细教程
- C#对list列表进行随机排序的方法
- MYSQL之插入极限分析
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C#折半插入排序算法实现方法
- SQL进行排序、分组、统计的10个新技巧分享
- C++实现位图排序实例
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- 与MSSQL对比学习MYSQL的心得(八)--插入 更新 删除