一步一步复习数据结构和算法基础-插入排序(1)

来源:互联网 发布:数据交换平台技术规范 编辑:程序博客网 时间:2024/06/05 04:05

插入排序的种类有很多,首先是最简单的直接插入排序;

直接插入排序:基本操作是将一个数据插入到已经排序好的数据里面;

#include<stdio.h>#include<stdlib.h>void InsertSort(int *array,int length){int i,k;for(i=2;i<=length;i++){if(*(array+i) < *(array+i-1)){//*array作为监视哨*array = *(array+i);*(array+i) = *(array+i-1);//数字后移,插入到正确的位置for(k=i-2;*array<*(array+k);k--)*(array+k+1) = *(array+k);*(array+k+1) = *array;}}}int main(){int i,length;int *array;scanf("%d",&length);array = (int*)malloc(sizeof(int)*(length+1));if(!array)exit(1);for(i=1;i<=length;i++)scanf("%d",array+i);InsertSort(array,length);for(i=1;i<=length;i++)printf("%d ",*(array+i));printf("\n");free(array);return 0;}

折半插入排序:减少比较次数的插入排序,但是时间复杂度不变

#include<stdio.h>#include<stdlib.h>void BInsertSort(int *array,int length){int i,k;int low,high,mid;for(i=2;i<=length;i++){low = 1;high=i-1;*array = *(array+i);//在数组中折半查找有序的位置while(low <= high){mid = (low+high)>>1;//折半if(*array < *(array+mid)) high = mid-1;//插入点在低半区else low = mid+1;//插入点在高半区}//后移for(k=i-1;k>=high+1;k--)*(array+k+1) = *(array+k);*(array+high+1) = *array;}}int main(){int i,length;int *array;scanf("%d",&length);array = (int*)malloc(sizeof(int)*(length+1));if(!array)exit(1);for(i=1;i<=length;i++)scanf("%d",array+i);BInsertSort(array,length);for(i=1;i<=length;i++)printf("%d ",*(array+i));printf("\n");free(array);return 0;}

现在在重新写一遍,加深印象

#include<stdio.h>#include<stdlib.h>#include<time.h>void insertsort(int array[],int length){int i,tmp,k;for(i=1;i<length;i++){tmp = array[i];for(k=i;k>0&&array[k-1]>tmp;k--)array[k] = array[k-1];array[k] = tmp;}}void bubblesort(int array[],int length){int i,k,tmp;for(i=0;i<length;i++){for(k=0;k<length-i-1;k++){if(array[k] > array[k+1]){tmp = array[k];array[k]=array[k+1];array[k+1]=tmp;}}}}void shellsort(int array[],int length){int i,k,tmp,increase;for(increase=length/2;increase >0;increase /= 2){for(i=increase;i<length;i++){tmp = array[i];for(k=i;k>=increase&&array[k-increase]>tmp;k-=increase)array[k] = array[k-increase];array[k] = tmp;}}}int main(){int i;int array[10];srand((unsigned)time(NULL));for(i=0;i<10;i++)array[i] = rand()%1000;shellsort(array,10);for(i=0;i<10;i++)printf("%d ",array[i]);printf("\n");return 0;}



原创粉丝点击