排序的本质与直接插入排序

1. 理解排序做的工作:

	排序的过程是一个逐步扩大记录的有序序列长度的过程,
	在排序的过程中可以将排序区分为两个区域:
		有序序列区 和 无需序列区

有序序列区: 已经排好序的序列
无序序列区: 尚未排好序的序列

我们所要做的工作就是: 把有序序列区一点一点增大直到长度变为最大为止,无需序列区一点点减少直到减为0位置

2.直接插入排序 的实质就是:把数组的前半部分看成有序序列区,数组的后半部分看成无序序列区

从无序序列区从左到右每次取一个元素和 有序序列区中的元素进行比较(遍历),如果比它小就交换

3.少啰嗦直接上代码

#include<stdio.h>
//交换两个变量
void swap(int *a,int *b){
		int temp=*a;
		 *a=*b;
		 *b=temp;
	}
int main(int argc, char const *argv[])
{

int a[]={1,3,2,2,4,23,6,5,7,9,8};
for(int i=1;i<sizeof(a) / sizeof(a[0]);i++){//待排序的数组,

	for(int j=0;j<i;j++){//已经排好序的数组,让第一层待排序的数组和这层排好序的数组比较,如果小于已排序中的那一个就和它交换
		if(a[i]<a[j]){
			swap(&a[i],&a[j]);
		}
	}
}
for(int i=0;i<sizeof(a) / sizeof(a[0]);i++){
	printf("%d,",a[i]);
}
getchar();

	return 0;
}

4.运行结果

在这里插入图片描述

5. 封装: 把insertSort 函数从main 中抽离出来:

#include<stdio.h>
//交换两个变量
void swap(int *a,int *b){
		int temp=*a;
		 *a=*b;
		 *b=temp;
	}

//遍历一个数组
void iterator(int a[],int length){
	for(int i=0;i<length;i++){
		printf("%d,",a[i]);
	}
}
//插入排序,由于c语言中没有办法使用 引用,所以这里我给他传入了一个数组的长度
void insertSort(int *a,int length){
	for(int i=1;i<length;i++){//待排序的数组,
	for(int j=0;j<i;j++){//已经排好序的数组,让第一层待排序的数组和这层排好序的数组比较,如果小于已排序中的那一个就和它交换
		if(a[i]<a[j]){
			swap(&a[i],&a[j]);
		}
	}
	
}


}
int main(int argc, char const *argv[])
{

int a[]={1,3,2,2,4,23,6,5,7,9,8};
	insertSort(a,sizeof(a)/sizeof(a[0]));
	iterator(a,sizeof(a)/sizeof(a[0]));
	// for(int i=0;i<sizeof(a) / sizeof(a[0]);i++){
		// printf("%d,",a[i]);
	// }
getchar();

	return 0;
}

封装后运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值