C语言实现插入排序


插入排序 :我在学习一些简单的算法,我用文字记录我的进步。

插入排序 其实就是在待排序列中找到,没有排序好的元素,插入的适当的位置,本文以升序为例,简单的讲解一下。

直接看下面的代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"


void swap(int array[], int i, int j)
{
	int temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}


void printArray(int array[], int len)
{
	int i = 0;

	for(i=0; i<len; i++)
	{
		printf("%d ", array[i]);
	}

	printf("\n");
}


void  insert_sort2(int arr[], int len ){
	for (int x =1;x<len;x++){
		for (int i=x-1;i>=0;i--){
			if(arr[i] > arr[i+1]){
				// swap
				swap(arr,i,i+1);

			}else{break;}

		}
	}

}


void insert_sort(int array[], int len){
        int i = 0;
        int j = 0;
        int k = -1;
        int tmp =-1;// i = 0 或者i= 1 开始都可以,array[0] 默认是排好序的。
        for (i = 1; i< len;i++){
            k = i;// 待插入位置
            tmp = array[k];
            // 这一轮 待插入的数字
            for (j = i - 1; j >= 0 && (array[j] > tmp);j--){
                array[j + 1] = array[j];
                k = j;// 记录目前的空的位置。 k 记录要插入的位置
            }
            array[k] = tmp;//元素插入
        }
}





int main()
{
	
	int array[]={1,34,6,21,98,31,7,4,36,47,67,39,45,57,37,25,2};
	int len = sizeof(array) / sizeof(*array); 

	printArray(array, len);
	insert_sort(array, len);
	printArray(array, len);

	system("pause");
	return 0;
}


简单说明:

insert_sort  核心就是这个函数,就是要把  待排集合中的第一个数字 记录下来,放到了临时变量tmp 中 ,for 外循环 ,从1 --> length-1 ,内循环j 从 i-1 --->0 递减, 

如果 j > 0  并且 arr[j]>tmp  ,即待排数字, 就要把arr[j] 的值往后移动一下,同时要更新k ,记录 tmp 最后 要放入的位置。 arr[j]  往后移动后,arr[j]  和arr[j+1] 是相同的值, 但是 tmp 已经 记录了 arr[j+1] 的值, 所以不用担心。内循环完成后,说明 k 的值找到了, tmp 的值 赋给  arr[k] 即可。 


insert_sort2  是第二种实现, 其实 和第一种 几乎一样, 外循环 也是 x 从 1 ----> length-1  , 内循环 i  从  x-1  ---> 0    这两个 循环完全一样, 不同的是:

arr[i] > arr[i+1]    也是判断这个 如果 后面的数字 比前面的大, 那肯定要 “移动”, 但是这个是直接交换, 思想就是 边交换,边寻找位置, 交换完成, 位置也就放到正确位置。

而算法insert_sort  ,采用 先找位置,之后 把值放到相应的位置。分两步。  insert_sort  是边交换,边找位置,同时进行,最后交换完成,位置刚好找好。





结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值