(直接)插入排序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环境中编译通过,仅供参考!





0 0