插入排序 和 选择排序
前段时间码了冒泡排序和选择排序,今天来捋一捋插入排序和选择排序。
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");
}