日期:2014-05-16 浏览次数:20754 次
1.直接插入排序
原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。
要点:设立哨兵,作为临时存储和判断数组边界之用。
实现:
[liul@test algorithms]$ more InsertSort.c
#include<stdio.h> void InsertSort(int L[],int length) { int i,j,Tmp; for(i=1;i<length;i++) { j=i+1; if(L[j]<L[i]) { Tmp=L[j]; while(L[0]<L[i]) { L[i+1]=L[i]; i--; } L[i+1]=Tmp; } } } main() { int i,length=7; int L[7]={4,7,6,9,8,7,9}; InsertSort(L,5); for(i=0;i<length;i++) { printf("%d ",L[i]); } printf("\n"); } [liul@test algorithms]$ gcc InsertSort.c -o InsertSort [liul@test algorithms]$ ./InsertSort 4 6 7 7 8 9 9
2.希尔排序
原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。
要点:增量的选择以及排序最终以1为增量进行排序结束。
实现:
[liul@test algorithms]$ more ShellSort.c #include<stdio.h> void ShellSort(int L[],int length) { int i,j,Tmp,k=length-1; while(k>0) { k/=2; for(i=k;i<length;i++) { Tmp=L[i]; j=i-k; while(j>=0 && Tmp<L[j]) { L[j+k]=L[j]; j=j-k; } L[j+k]=Tmp; } } } int main() { int i,length=8; int L[8]={4,7,6,9,8,7,9,2}; ShellSort(L,8); for(i=0;i<length;i++) { printf("%d ",L[i]); } printf("\n"); } [liul@test algorithms]$ gcc ShellSort.c -o ShellSort [liul@test algorithms]$ ./ShellSort 2 4 6 7 7 8 9 9 [liul@test algorithms]$