各种排序算法比较

稳定:冒泡排序、插入排序、归并排序和基数排序
不稳定:选择排序、快速排序、希尔排序、堆排序
  • 插入排序:一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
      1. 从第一个元素开始,该元素可以认为已经被排序
      2. 取出下一个元素,在已经排序的元素序列中从后向前扫描(可用二分查找,二分查找适用于已排序的数列)
      3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
      4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
      5. 将新元素插入到下一位置中
      6. 重复步骤2
  • 希尔排序:
  • 冒泡排序:第一趟,从最后的n-1个数开始,与前面一个数两两比较,直到把最小一个数放到第一位。第二趟,也是从最后的n-1个数开始,与前面一个数两两比较,直到把最小一个数放到第二位。以此类推。
  • 快速排序:将第一个数A1作为分割点,小于A1的放到A1前面,大于A1的放到A1后面,这样就有两个集合A,B,然后分别把A,B的第一个数分别作为各自的分割点,继续分割出4个集合,以此类推,继续分出8个集合,直至每个集合中只剩一个元素。可以想象成这个过程是一个树,所以要用递归。 
  • 选择排序:第一趟,选择第一个数作为标准,逐一比较后面的数,比它小的与之替换;第二趟,选择第二个数作为标准,逐一比较后面的数,比它小的与之替换,以此类推,每趟都会得出最后的数,这个算法适合从大量数据中中选择一部分排序记录。
  • 堆排序:
  • 归并排序:
  • 基数排序: 
二分查找:
int binary_search(int* a, int len, int goal)
{
int low = 0;
int high = len - 1;
while(low <= high)
{
int middle = (low + high)/2;
if(a[middle] == goal)
return middle;
//在左半边
else if(a[middle] > goal)
high
= middle - 1;
//在右半边
else
low
= middle + 1;
}
//没找到
return -1;

} 

posted @ 2011-11-30 11:31  苏先森1989  阅读(339)  评论(2编辑  收藏  举报