//Shell排序是对插入排序的一种改进,在最坏的情况下时间复杂度为O(n2),在最好的情况下为O(n);当插入的数据基本有序的时候插入的效率时最高的; //Shell的基本思想是先将整个要排序的序列分成若干个子序列,分别对各个子序列进行直接插入排序,当各个子序列基本有序时,再对子序列进行一次插入排序; #include <stdio.h> #include <stdlib.h> #include <math.h> void shellinsert(int array[],int number,int incr); void shellsort(int array[],int number,int t); int main() { int i,count; printf("please input the number of the data:\n"); scanf("%d",&count); int array[count]; printf("please input the number:\n"); for(i=0;i<count;i++) { scanf("%d",&array[i]); } printf("before sort:\n"); for(i=0;i<count;i++) { printf("%d ",array[i]); } printf("\n"); shellsort(array,count,3); printf("after sort:\n"); for(i=0;i<count;i++) printf("%d ",array[i]); printf("\n"); return 0; } void shellinsert(int array[],int number,int inc) { int i,j; for(i=inc;i<number;i++) { int temp=array[i]; for(j=i-inc;j>=0 && temp<array[j];j-=inc) { array[j+inc]=array[j]; } array[j+inc]=temp; } printf("%d\n",i); } void shellsort(int array[],int number,int t) { int k;//k表示第几趟排序,t表示一共排序几趟; int incr[3]={7,3,1}; for(k=0;k<t;k++) { // incr[k]=pow(2,t-k)-1; shellinsert(array,number,incr[k]); } }
#include <iostream> using namespace std; void shellinsert(int a[],int n,int incr); void shell(int a[],int n,int inc[],int t); int main() { int number; cout<<"请输入你的数组的个数:"<<endl; cin>>number; int a[number]; int inc[]={7,3,1}; cout<<"请输入你的数据:"<<endl; for(int i=0;i<number;i++) { cin>>a[i]; } cout<<"请确认你输入的数据:"<<endl; for(int i=0;i<number;i++) { cout<<a[i]<<" "; } cout<<endl; cout<<endl; shell(a,number,inc,3); cout<<"排序后的顺序是:"<<endl; for(int i=0;i<number;i++) { cout<<a[i]<<" "; } } void shellinsert(int a[],int number, int zen) { for(int i=zen;i<number;i++) { int e=a[i]; int j; for(j=i-zen;j>=0&&e<a[j];j-=zen) { a[j+zen]=a[j]; } a[j+zen]=e; } } void shell(int a[],int number,int inc[],int t) { for(int k=0;k<t;k++) { shellinsert(a,number,inc[k]); } }