赞
踩
前段时间码了冒泡排序和选择排序,今天来捋一捋插入排序和选择排序。
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"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。