一.直接插入排序( straight insertion sort )是一种最简单的排序方法。
它的基本操作是将一个记录插入到一个长度为 m (假设)的有序表中,使之仍保持有序,从而得到一个新的长度为 m + 1 的有序表。
此算法外循环 n-1 次,在一般情况下内循环平均比较次数的数量级为O(n) ,所以算法总时间复杂度为O(n2) 。
插入排序的过程中,比较的过程就是一个查找的过程,为了更加快速的找到“合适的位置”,可以使用高效些的查找算法,例如和折半查找结合,就形成了 折半插入排序。
#include<stdio.h> void insertionsort(int a[],int n) { int i,j,key; for(i=1;i<n;i++){ key=a[i]; for(j=i-1;a[j]>key;j--) a[j+1]=a[j]; a[j+1]=key; } } int main() { int i,n; int a[100]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); insertionsort(a,n); for(i=0;i<n;i++) printf("%d ",a[i]); }
#include <iostream> using namespace std; const int n=10 ; int main( ) { void f(int a[],int n ) ; int a[n] ={ 42,65,80,74,36,44,28,65,94,72 } ; f(a,n) ; for(int i=0; i<n; i++) cout<<a[i]<<" " ; cout<<endl ; } void f(int a[],int n) { int i,j,x ; for(i=1;i<n ;i++) { x=a[i] ; for(j=i-1;j>=0;j--) if(x<a[j]) a[j+1]=a[j] ; else break ; a[j+1]=x ; } }
#include<stdio.h> #define M 100 int R[M]; void insertSort(int n) { int i,j; for (i=1;i<n;i++) { if(R[i]<R[i-1]) { R[0]=R[i]; for(j=i-1;R[j]>R[0];j--) R[j+1]=R[j]; R[j+1]=R[0]; } } } int main() { int i,n; scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&R[i]); printf("before sort numbers "); for (i=1;i<=n;i++) printf("%4d",R[i]); insertSort(n);/*调用直接插入了排序*/ printf(" after sort numbers "); for (i=1;i<=n;i++) printf("%4d",R[i]); }