纯手撸——直接插入排序

数据结构复习的最后一章节,给自己个小目标一礼拜内完纯手撸完考纲必考排序的代码,保持独立思考。


首先是直接插入排序,顺一遍步骤:

  • 假设给定数组(整型)第一个元素有序
  • 从第二个元素开始,与自己左边的第一个元素比较,如果比自己小,则不动;如果比自己大,就与自己左边的第二个元素比较;直到遇到不比自己大的元素,在其右边插入
  • 选取后面的元素,依次重复第二步
#include<stdio.h>
//后面为了测试写的输出,输出每一次排序后的信息。这是后面补上的,方便观察,必须放在InsertSort方法前 
void print(int a[], int n ,int i){
    printf("%d:",i);
    for(int j=0; j<8; j++){ //这里可自行修改
        printf("%d",a[j]);
    }
    printf("\n");
}

//直接插入排序 
void InsertSort(int a[],int n){ //a为要排序的数组,n为元素总个数 (即长度)
	for(int i=1;i<n;i++){ //默认第一个元素有序,故i从地址下标1处开始循环
		if(a[i]<a[i-1]){ //第i个元素大于i-1元素,不动;反之,要找适当位置插入 
			int j=i-1; //j指向i的左边第一个元素
			int tmp=a[i]; //临时存储待插入元素
			while(j>-1&&tmp<a[j]){ //找要插入的位置 
				a[j+1]=a[j]; //数组元素后移一个位置,这是为了给待插入元素腾出位置 
				j--; 
			} 
			a[j+1]=tmp; //插入正确的位置,即最后比较不比自己大的元素的右边 
		}
		print(a,n,i);//打印每次排序后的结果 
	}
}

//测试 
int main(){
	int a[8]={3,1,7,5,2,4,9,6}; //预计 1 2 3 4 5 6 7 9
	InsertSort(a,8);
} 

复盘一下:

void InsertSort(int a[],int n)
{
	for(int i=1;i<n;i++) 
	{
		if(a[i]<a[i-1])
		{	
			int j=i-1;
			int tmp=a[i];
			for (;j>0&&tmp<a[i];j--)
			{
				a[j+1]=a[j]; //后移
			}
			a[j+1]=tmp; //插入
		}
	}
}
posted @ 2020-08-06 11:33  我在吃大西瓜呢  阅读(317)  评论(0编辑  收藏  举报