首页 > 编程语言 > 详细

归并排序、快速排序

时间:2015-10-30 20:24:55      阅读:292      评论:0      收藏:0      [点我收藏+]

归并排序

对于一个数字序列,它越接近已排好序的状态,插入排序的效率越高。对已经排好序的数列,插入排序只用比较n-1次就可以了。

我们可以不准确的把归并排序看作插入排序的并行运行,即划分--》子项分别插入排序--》合并

- - - - - - - -

- - - -|- - - -

- -|- -|- -|- -

-|-|-|-|-|-|-|-

从上到下,对一个数组进行不断划分,从下到上看,子项分别插入排序--》合并。在这个过程中,我们实际对插入排序进行了分治。

void merge_sort(int *pArr, int len)
{
  //系数检查
  if(NULL == pArr || len < 1)
  {
    return;
  }
  int *gArr = (int *)malloc(len * sizeof(int));
  //库函数调用检查
  if(NULL == gArr)
  {
    return;
  }
  merge_sort_index(pArr, 0, len - 1, gArr);
  free(gArr);
}
void merge_sort_index(int *pArr, int lIndex, int rIndex, int *gArr)
{
  if(lIndex == rIndex)
  {
    return;
  }
  int mIndex = (lIndex + rIndex)/2; //<-- 整数除
  merge_sort_index(pArr, lIndex, mIndex, gArr);
  merge_sort_index(pArr, mIndex + 1, rIndex, gArr);
  merge_array(pArr, lIndex, mIndex, rIndex, gArr);
}
void merge_array(int *pArr, int left, int mid, int right, int *gArr)
{
  int i, j, k;
  i = left;
  j = mid + 1;
  k = 0;
  while(i <= mid && j <= right) //<-- i <= mid && j <= right
  {
    if(*(pArr + i) <= *(pArr + j))
    {
      gArr[k++] = pArr[i++];
    }
    else
    {
      gArr[k++] = pArr[j++];
    }
  }
  while(i <= mid)
  {
    gArr[k++] = pArr[i++];
  }
  while(j <= right)
  {
    gArr[k++] = pArr[j++];
  }
  memcpy(pArr + left, gArr, k * sizeof(int)); //<-- pArr + left
}

快速排序:

这个就简单了,就是对找中值这个过程进行分治

//0, len-1
void quick_sort(int *pArr, int left, int right)
{
  //参数检查
  if(NULL == pArr)
  {
    return;
  }
  //递归中断条件
  if(left >= right)
  {
    return;
  }

  int i, j, temp;
  i = left;
  j = right;
  temp = pArr[i];

  while(i < j)
  {
    while(i < j && temp < pArr[j]) j--;
    if(i < j) pArr[i++] = pArr[j]; //i++
    while(i < j && temp >= pArr[i]) i++;
    if(i < j) pArr[j--] = pArr[i]; //j--
  }
  pArr[i] = temp;

  //中间数据完成排序
  quick_sort(pArr, left, i-1); //i-1
  quick_sort(pArr, i+1, right); //i+1
}

归并排序、快速排序

原文:http://www.cnblogs.com/kellis/p/sort.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!