Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9087
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-23 12:00
个人简介

^_^

文章分类

全部博文(10)

文章存档

2014年(5)

2013年(5)

分类: C/C++

2014-03-16 15:15:27

最近很发奋的又想到再看看排序算法。要学习的很多,总是有很多不足。压力山大啊。

1.直接插入排序。
就这么简单的排序,看了好久才弄懂他的流程。唉,年纪大了。脑袋都不好使了!
{49}  {38} {13} {65} {97} {76}
将第一个数字看作是有序的。则 第一次{38} 与{49}比较,{38} 小于 {49}
将{38}置为哨兵。---大于其的数字向后移动,而哨兵的值一直往前寻找自己合适插入的位置,直到比较的值小于或者等于自己。

  1. //直接插入排序: 第一个当作哨兵
  2. void insertSort(int a[], int len)
  3. {
  4.     int i, j;
  5.     for(i = 2; i < len; i++)
  6.     {
  7.      if(a[i] < a[i-1])
  8.      {
  9.      a[0] = a[i];
  10.             a[i] = a[i-1];
  11.             for(j = i-2; a[0] < a[j]; j--)
  12.             {
  13.              a[j+1] = a[j];
  14.             }
  15.             a[j+1] = a[0];
  16.      }
  17.     }
  18. }

2.直接插入排序改版---折半插入排序

  1. //折半插入排序
  2. void insertSort1(int a[], int len)
  3. {
  4.     int i, j;
  5.     int low, high, mid;
  6.     for(i = 2; i < len; i++)
  7.     {
  8.      a[0] = a[i];
  9.         low = 1;
  10.         high = i-1;
  11.         while(low <= high)
  12.         {
  13.          mid = (low + high)/2;
  14.             if(a[mid] > a[0])
  15.                 high = mid -1;
  16.             else
  17.                 low = mid + 1;
  18.         }
  19.         for(j=i-1; j>=high+1; j--)
  20.         {
  21.          a[j+1] = a[j];
  22.         }
  23.         a[high+1] = a[0];
  24.     }
  25. }

3.希尔排序
1.将序列按增量划分为元素个数相同的若干组,使用直接插入排序进行排序,然后不断缩小增量到1.最后使用直接插入排序完成排序

  1. //希尔排序
  2. //间隔比较
  3. void insertShellSort(int a[], int len, int dk)
  4. {
  5.     int i,j;
  6.     for(i=dk+1; i<len; i++)
  7.     {
  8.      if(a[i] < a[i-dk])
  9.         {
  10.          a[0] = a[i];
  11.             a[i] = a[i-dk];
  12.             for(j=i-dk-dk; j>0&&a[0]<a[j]; j-=dk)
  13.                 a[j+dk] = a[j];
  14.             a[j+dk] = a[0];
  15.      }    
  16.         
  17.     }
  18. }

  19. void shellSort(int a[], int len, int d)
  20. {
  21.     while(d >= 1)
  22.     {
  23.         insertShellSort(a, len, d);
  24.         d = d/2;
  25.     }
  26. }

4.冒泡排序

  1. //冒泡排序----设置一个跳出条件
  2. void MaoPaoSort(int a[], int len)
  3. {
  4.     int i, j;
  5.     int tmp;
  6.     bool bchange;
  7.     for(i=len-1; i>0; i--)
  8.     {
  9.      bchange = false;
  10.      for(j=0; j<i; j++)
  11.      {
  12.      if(a[j] > a[j+1])
  13.      {
  14.      tmp = a[j];
  15.                 a[j] = a[j+1];
  16.                 a[j+1] = tmp;
  17.                 bchange = true;
  18.      }
  19.      }
  20.         if(!bchange)//说明已经有序
  21.             break;
  22.     }
  23. }

阅读(212) | 评论(0) | 转发(0) |
0

上一篇:单链表操作总结

下一篇:没有了

给主人留下些什么吧!~~