插入排序 和 选择排序

插入排序 和 选择排序

前段时间码了冒泡排序和选择排序,今天来捋一捋插入排序和选择排序。

在这里插入图片描述

1.区别

插入排序:通过插入的方法,对无序序列进行排序。

昂前段时间因为理解不到位,写着写着愣是把插入排序写成了选择排序…-||-

研究了一波在我的肤浅想法里,其实,插入排序和选择排序的差别是:首先,插入排序选定当前排序位置后,是和前面的有序列(有序列就是前面已经排好序的)进行比较排序;而选择排序呢是当前排序位置和后面的无序列(就是剩下的还没有排序的)进行排序比较的。其次,插入排序是前面有序列两两进行位置交换,而选择排序是当前位置和找到的目标位置直接进行交换(可谓一步到位)。

在这里插入图片描述
图像化一点就是:
首先通过一重循环控制排序的位置,如下图temp表示选择排序的当前索要排序的位置,第一次的时候是0.那么就没得排了,直接跳到第二个。然后通过二重循环控制要进行比较的有序区间,就是0到目前位置的区间,然后以前比较a[j]和a[temp],直到找到相应位置。(鼠标下班了,手动画图不清楚会不会被带歪0.0)

还是来比较一下代码趴:
插入排序:

#include<stdio.h>
const int N=105;
int a[N];
void InsertSort(int *,int) ;
int main(){
	int n;
	scanf("%d",&n);//读取个数 
	for(int i=0;i<n;i++){//读取数组 
		scanf("%d",&a[i]);
	} 
    InsertSort(a,n);//调用插入排序 
	for(int i=0;i<n;i++){//输出最后结果 
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}
void InsertSort(int *a,int size){
	int temp,i,j;
	
	for(i=0;i<size;i++){//排列第n个 
		temp=a[i];
		for(j=i;j>0&&a[j-1]>temp;j--){//在有序区间内 
			a[j]=a[j-1];
		} 
	a[j]=temp; 
    /*for(int k=0;k<size;k++)//每个交换后的输出 
    	printf("%d ",a[k]);
    printf("\n");*/
	}
}

选择排序:

#include<stdio.h>
void xuanze(int *,int);

int main(){
	int a[100];//定义一个足够大的数组 
	int len,i;
	scanf("%d",&len);//输入的数目 
	for(i=0;i<len;i++)//输入数据 
		scanf("%d",&a[i]);
	xuanze(a,len); //调用选择排序 
	return 0;
	} 
	
void xuanze(int *a,int len){
	int i,j,temp;
	for(i=0;i<len-1;i++){//控制趟数
	int min=i; //排a[i]的位置 
		for(j=i+1;j<len;j++){//在i后未排序的进行遍历 
			if(a[j]<a[min]){
			temp=a[j];
			a[j]=a[i];
			a[i]=temp;
			min=j; 
			} 
		}
	}
	for(i=0;i<len;i++)//输出 
		printf("%d ",a[i]);
		
	printf("\n");
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值