日期:2014-05-16  浏览次数:20671 次

linux c 实现八大排序算法总结--正在修正

插入排序

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]$