插入排序 和 选择排序

插入排序 和 选择排序

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

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("
");
	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("
");*/
	}
}

选择排序:

#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("
");
}
经验分享 程序员 微信小程序 职场和发展