三种插入排序
Posted wzqstudy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三种插入排序相关的知识,希望对你有一定的参考价值。
#include "stdio.h" #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType r[MAXSIZE+1]; int length; }SortList; void crelist(SortList *L) { int i = 0; ElemType x; printf("Input data(-1:End):"); scanf("%d",&x); while(x!=-1) { if(i>MAXSIZE) {--i;break;} L->r[++i] = x; scanf("%d",&x); } L->length = i; } void list(SortList *L) { int i; for(i=1;i<=L->length;i++) { printf("%5d",i); } printf(" "); for(i=1;i<=L->length;i++) printf("%5d",L->r[i]); printf(" "); } /* 直接插入排序算法 最好情况:T(n) = O(n) 最坏情况:T(n) = O(n^2) 平均时间性能为T(n)=O(n^2) */ void InsertSort(SortList *L) { int i,j; for(i=2;i<=L->length;i++) { if(L->r[i]<L->r[i-1]) { L->r[0] = L->r[i]; for(j=i-1;L->r[0]<L->r[j];j--) L->r[j+1] = L->r[j]; //比待排序记录关键字大的记录后移 L->r[j+1] = L->r[0]; } } } /* 折半插入排序算法 时间复杂度 O(n^2) */ void BiInsertSort(SortList *L) { int i,j,low,high,mid; for(i=2;i<=L->length;i++) { L->r[0] = L->r[i]; low = 1; high = i-1; while(low<=high) { mid = (low+high)/2; if(L->r[0]<L->r[mid]) high = mid - 1; else low = mid + 1; } for(j=i-1;j>=high+1;--j) L->r[j+1] = L->r[j]; L->r[high+1] = L->r[0]; } } //希尔排序 Shell Sort /* 时间复杂性O(n^4/3) */ void ShellSort(int a[],int length) { int increment; int i,j; int temp; for(increment=length/2;increment>0;increment/=2) //控制步长,最后递减到1 { for(i=increment;i<length;i++) { temp = a[i]; for(j=i-increment;j>=0&&temp<a[j];j-=increment) { a[j+increment] = a[j]; } a[j+increment] = temp; } } }
以上是关于三种插入排序的主要内容,如果未能解决你的问题,请参考以下文章