(直接)插入排序INSERT_SORT
来源:互联网 发布:公路标线怎么施工数据 编辑:程序博客网 时间:2024/06/07 06:35
一、伪代码
/*INSERT_SORT(A)*/for j = 2 to A.length key = A[j] //Insert A[j] into the sorted sequence A[1..j-1]. i = j-1 while i>0 and A[i]>key A[i+1] = A[i] i = i-1A[i+1] = key
二、算法描述
数组A[1..n]是一个包含n个元素的待排序的序列,其长度用A.length表示,显然有A.length=n.从序列A的第二个元素开始,在循环变量为j的for循环中,每次迭代开始时,包含元素A[1..j-1]的子序列是已经排序好的序列,剩下的子序列A[j+1..n]就是待排列的序列,而元素A[j]就是待插入(已排列好的序列A[1..j-1]中)元素,待排列中的第一个元素取就是下一次待插入的元素。将待排列元素A[j]的值存储在临时变量key中,然后key和A[j-1]即A[i]比较大小。当key的值小于已排列好的序列A[1..j-1]中的最大值即A[j-1],那么将A[j-1]向后移动一位即将A[j-1]的值赋给A[j],(此时A[j]的值仍然保存在变量key中,所以不必担心A[j]的值被覆盖)这一步是通过语句A[i+1]=A[i](i=j-1)来实现的。接着执行语句i=i-1,回到while语句的条件判断A[i]>key,即将key的值和已经排列好的序列中的第二大的元素A[j-2]即A[i](此时i=(j-1)-1),如果条件满足则重复上一过程,否则跳出while循环,并把key的值赋给元素A[i+1],至此完成了一次插值,即为元素A[j]找到了合适的插入位置。
简单来说,(直接)插入排序算法就是依次从序列A[1..n]中取出一个元素A[j]并与前一个元素A [j-1]相比,如果取出的元素的值A[j]比之前一个元素的值A[j-1]大,则将取出的元素A[j]放在前一个元素A[j-1]之后,否则将取出的元素A[j]和前一个元素A[j-1]的前一个元素A[j-2]相比,重复该过程,直到找到第一个小于取出的元素A[j]的元素A[i],则将取出的元素A[j]放在元素A[i]之后,完成了一次插入排序。重复上述过程,直到完成所有元素的排序。
【注】上述过程假设将序列A[1..n]按照从小到大的顺序进行排序。
三、C语言源代码
/*******************************源代码(一) By 羽墨*根据《算法导论》中伪代码编写*******************************/void insert_sort(int *A){int length = 6;int i=0,j=0;int key=0;for(j=1;j<=length-1;j++){key = A[j];//Insert A[j] into the sorted sequence A[1..j-1].i = j-1;while(i>=0&&A[i]>key){A[i+1] = A[i];i = i-1;}A[i+1] = key;}}
/*******************************源代码(二) By 羽墨*在理解上述代码的基础上重新编写*******************************/void insert_sort(int *A){int i=0;int length = 6;int key = A[0];for(i=0;i<length;i++){int j = 0;key = A[i];for(j=i-1;j>=0;j--){if(key<A[j]){A[j+1] = A[j];}else{break;}}A[j+1] = key;}}
/******************************主函数 By 羽墨*****************************/void main(){int array[] = {5,2,4,6,1,3};//初始化待排序数组printf("The original");print_array(array);//打印原始数组insert_sort(array);printf("The sorted");print_array(array);//打印排序后的数组}
/**********************运行结果********************/The original array = [5 2 4 6 1 3 ] //原始数组The sorted array = [1 2 3 4 5 6 ] //排序后的数组
其中,数组打印函数为print_array()。
/*******************************数组打印函数 By 羽墨*******************************/void print_array(int *array){int i = 0;printf(" array = [");for(i=0;i<=5;i++){printf("%d ",array[i]);}printf("]\n");}
以上代码为笔者阅读《算法导论》时的练习笔记,作记录之用,在VC++ 6.0环境中编译通过,仅供参考!
- (直接)插入排序INSERT_SORT
- Insert_sort 插入排序
- 插入排序(Insert_Sort)
- 插入排序 insert_sort
- scala 实习插入排序(Insert_sort)
- # INSERT_SORT&MERGE_SORT插入排序与归
- 插入排序(insert_sort)与 并归排序(merge_sort) 算法分析
- 排序(直接插入排序)
- 插入排序一(直接插入排序)
- 算法---插入排序(直接插入排序)
- 插入排序(希尔排序、直接插入、折半插入排序)
- 数据结构-插入排序(直接插入排序+折半插入排序)
- 直接插入排序(稳定)
- (24)直接插入排序
- 直接插入排序(python)
- (2)直接插入排序
- 排序:插入排序(直接插入排序、Shell排序)
- 【排序】插入排序(直接插入排序、希尔排序)
- CSDN的第一篇博客
- Hadoop中mapReduce处理过程详解
- 【链表7】删除链表中重复的结点
- android中PathMeasure的简单用法
- android学习——popupWindow 在指定位置上的显示
- (直接)插入排序INSERT_SORT
- GTK+ 3 for Windows 开发环境搭建
- java代码写入数据库注意事项
- 鬼影病毒
- 剑指Offer 36题 数组中的逆序对 Java版 这个和归并排序一起看 对比差别在哪
- 获取WebView加载HTML时网页中的内容
- Cocoapods的Podfile常见语法总结
- 美团笔试之编程题
- ListView和适配器