偶得空,遂念经典算法,务必斩其马下,也解偶之惑也!
简单插入排序(升序):
void simple_insert(int str[],int len) { int i,j,tmp; for(i=1; i<len; i++) { if(str[i]<str[i-1])//存在逆序 { tmp = str[i]; j = i-1; do { str[j+1] = str[j]; j--; } while(j>=0 && tmp<str[j]); str[j+1] = tmp; } } }
shell排序(升序):
void shell_insert(int str[],int len) { int d = len; while( (d = d/2) >=1) //距离逐步变小,直到为1 { shell_pass(str,len,d); } } void shell_pass(int str[],int len,int d) { int i,j; int tmp; for(i=d;i<len;i++) { if(str[i] <str[i-d]) //存在逆序 { tmp = str[i]; j=i-d; do { str[j+d] = str[j]; j=j-d; } while(j>=0 && tmp<str[j]); str[j+d] = tmp; } } }
若简单插入排序已基本按序,则效率较shell排序高。正常情况下,shell排序较简单插入效率会更高!