Fork me on GitHub

排序算法之直接插入排序

基本思想:设置第一个为哨岗,后面一个比较,如果小,大的后移,如果大,插在后面,

然后再取下一个,再往序列里插,后往前比较

//直接插入排序算法的实现
//本算法是在参照严蔚敏教材的基础上,为实际运行需要加以改进
//为了学习需要,我们直接对整数数组进行排序操作,实际稍加修改可用于其它数据结构

#include<stdio.h>
#define Length 10

//函数声明,函数实现在程序末部分
void DirectInsertSort(int*,int);

void main()
{
	int L[Length];
	int i;

	printf("请分别输入%d个整数:\n",Length);
	
	for(i=0;i<Length;i++)
	{
		printf("\n请输入第%d个整数:",i+1);
        scanf("%d",&L[i]);
	}

   	printf("\n排序前:");
	for(i=0;i<Length;i++)
	{
		printf("%5d",L[i]);
	}

	DirectInsertSort(L,Length);
	
	printf("\n排序后:");
	for(i=0;i<Length;i++)
	{
		printf("%5d",L[i]);
	}
	printf("\n");

}

//算法实现
//直接插入排序的算法复杂度是O(n^2),空间复杂度为O(1),仅需要一个辅助空间,也就是本程序中的

fence
//正序的情况下,需要进行n次比较,逆序情况下,比较次数为O(n^2)
//正序的情况下,需要进行0次移动,逆序情况下,移动次数为O(n^2)
//直接插入排序是一种稳定的排序算法
void DirectInsertSort(int* L,int length){
	int i,j;
	int fence;//哨岗

	for(i=1;i<length;i++)
		if(L[i]<L[i-1]){
          //把小者作为哨岗,即后面位移的参照
		  fence=L[i];
		  L[i]=L[i-1];
		

		//通过上面的操作,已经把i-1移到正确的i位置
		//因而需要把i-1之前的凡是比哨岗大的,便往后挪
		//最后空出来的位置便是正确的插入位置
	    
	    //由于实际应用中,C语言通常是从0开始,所以比原书上多了一个条件
        //因为如果当i=1,i-2就没有意义了,这时就相当把哨岗作为临时变量作了个交换而已
		for(j=i-2;j>=0&&L[j]>fence;j--) L[j+1]=L[j];
		L[j+1]=fence;
		}

 }


posted @ 2011-10-05 18:38  浪飞-louffy  阅读(157)  评论(0编辑  收藏  举报