Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260577
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-04-05 11:53:15

1.插入排序
原理:从第二个元素开始拿出元素,向其前面的区间里插。知道插到最后一个元素完了即有序。
特点:序列接近有序时效率较高,适合小于千级数量的排序。
时间复杂度:O(N^2) 最好的时候接近O(N),即每次插的位置都是其原位,不用挪动。
空间复杂度:O(1)

  1. void InsertSort(int *a,size_t size)
  2. {
  3.     assert(a);
  4.     for(int i = 1;i < size;++i)
  5.     {
  6.         int tmp = a[i];
  7.         int j;
  8.         for(j = i-1;j >= 0 &&tmp < a[j];--j)
  9.         {
  10.             a[j+1] =a[j];
  11.         }
  12.         a[j + 1] = tmp;
  13.     }
  14. }
2.希尔排序
原理:希尔排序其实是插入排序的优化,其排序的最后一趟即为插入排序,之前多做的比较是为了让序列接近有序,提高希尔排序效率。
时间复杂度:O(N^1.3)
空间复杂度:O (1)

代码:

  1. void ShellSort(int *a,size_t size)
  2. {
  3.     int gap = size;
  4.     while(gap > 1)
  5.     {
  6.         gap = gap/3 + 1;//加1防止gap小于1
  7.         for(int i = gap;i < size;++i)
  8.         {
  9.             int tmp = a[i];
  10.             int end = i - gap;
  11.             while(end >= 0 && tmp < a[end])
  12.             {
  13.                 a[end+gap] = a[end];
  14.                 end -= gap;//倒回去比
  15.             }
  16.             a[end + gap] = tmp;
  17.         }
  18.     }
  19. }
3.选择排序
原理:每次从待排序的元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
特点:不稳定
时间复杂度:O(N^2)
空间复杂度:O(1)

  1. void SelectionSort(int a[],size_t size)
  2. {
  3.     assert(a);
  4.     for(int i = 0;i < size - 1;++i)
  5.     {
  6.         int min = i;
  7.         for(int j = i + 1;j < size;++j)
  8.         {
  9.             if(a[j] < a[min])
  10.             {
  11.                 min = j;
  12.             }
  13.         }
  14.         if(a[min] != a[i])
  15.         {
  16.             int tmp = a[i];
  17.             a[i] = a[min];
  18.             a[min] = tmp;
  19.         }
  20.     }
  21. }
4.堆排序
原理:利用二叉堆进行排序。
特点:需要辅助空间,适合海量数据比较。
时间复杂度:O(N*lgN)
空间复杂度:O(1)

  1. void AjustDown(int *a,size_t size,size_t root)
  2. {
  3.     assert(a);
  4.     int child = root * 2 + 1;
  5.     int parents = root;
  6.     while(child < size)
  7.     {
  8.         if(child + 1 < size && a[child+1] > a[child])
  9.         {
  10.             child++;
  11.         }
  12.         if(a[child] > a[parents])
  13.         {
  14.             swap(a[child],a[parents]);
  15.             parents = child;
  16.             child = child *2 +1;
  17.         }
  18.         else
  19.         {
  20.             break;
  21.         }
  22.     }
  23. }
  24. void HeapSort(int *a,size_t size)
  25. {
  26.     assert(a);
  27.     //单趟堆排,建堆
  28.     for(int i = (size - 2)/2;i >= 0;--i)//size - 1为最后一个元素,在-1除2为第一个叶子节点的根节点
  29.     {
  30.         AjustDown(a,size,i);
  31.     }
  32.     //开始调整
  33.     for(int i = size -1;i > 0; --i)
  34.     {
  35.         swap(a[i],a[0]);
  36.         AjustDown(a,i,0);
  37.     }
  38. }

测试

  1. void Print(int *a,size_t size)
  2. {
  3.     assert(a);
  4.     for(int i = 0;i < size;++i)
  5.     {
  6.         printf("%d ",a[i]);
  7.     }
  8.     cout<<endl;
  9. }
  10. #include <iostream>
  11. using namespace std;
  12. #include "Sort.h"


  13. void Test()
  14. {
  15.     int a[10] = {2,4,3,8,5,1,6,7,9,0};
  16.     //InsertSort(a,10);
  17.     //ShellSort(a,10);
  18.     //SelectionSort(a,10);
  19.     HeapSort(a,10);
  20.     Print(a,10);
  21. }
  22. int main()
  23. {
  24.     Test();
  25.     return 0;
  26. }




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

上一篇:HashTableBucket哈希桶

下一篇:head头部标签

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