归并排序、快速排序

归并排序

对于一个数字序列,它越接近已排好序的状态,插入排序的效率越高。对已经排好序的数列,插入排序只用比较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
}

时间: 2024-11-05 17:24:22

归并排序、快速排序的相关文章

归并排序 &amp;&amp; 快速排序

归并排序: 时间复杂度为O(nlogn) 这是该算法中最好.最坏和平均的时间性能.空间复杂度为 O(n) 归并排序比较占用内存,但却是一种效率高且稳定的算法. 速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列. 具体思路是,在归并的过程中计算每个小区间的逆序对数,进而计算出大区间的逆序对数. 归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4)

高级排序算法之归并排序,快速排序

前言 承接上文基础排序算法-冒泡,插入,选择,相比之下,归并排序和快速排序更为高效,时间复杂度均为O(nlogn),相比简单排序的O(n^2)好了很多,下面介绍一下这两种算法的思路,实现和主要指标.主要思路来自<数据结构与算法之美> 正文 归并排序 主要思路 在归并排序采用分冶的思想,使用递归实现.描述如下 开始归并排序 如果数组元素小于两个,无需排序,结束 否则需要排序,归并排序数组左侧,归并排序数组右侧,按序合并左右侧 采用的是自顶至下的思路,例如[1,5,3,7,4,6],左侧为[1,5

8大排序算法---我熟知3(归并排序/快速排序/堆排序)

排序算法: 快排: o(nlogn) o(1)不稳定 归并:o(nlogn) o(n) 稳定 基数: 冒泡 睡眠 面条 烙饼 1.quicksort: 返回条件:start >=end private = a[start]+a[end]/2 while(left <= right) while(left <= right && a[left] < privot) while(left <= right && a[right] > priv

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O

代码面试最常用的10大算法

摘要:面试也是一门学问,在面试之前做好充分的准备则是成功的必须条件,而程序员在代码面试时,常会遇到编写算法的相关问题,比如排序.二叉树遍历等等. 在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序.二叉树查找等等. 本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了解这些算法的原理,还需程序员们花些功夫. 1.String/Array/Matrix 在Java中,String是一个包含char数组和其它字段.方法的类

程序语言的奥妙:算法解读 &mdash;&mdash;读书笔记

算法(Algorithm) 是利用计算机解决问题的处理步骤. 算法是古老的智慧.如<孙子兵法>,是打胜仗的算法. 算法是古老智慧的结晶,是程序的范本. 学习算法才能编写出高质量的程序. 懂得了算法,游戏水平会更高. 比如下棋,如果懂得棋谱,就不需要每次考虑"寻找最好的一步棋",按照棋谱 就可以走出最好的几步棋.棋谱是先人们智慧的结果,因此掌握多种棋谱的人更 容易在对弈中获得胜利. 算法的学习类似学习游戏攻略. 算法是编写好程序的"棋谱". 算法必须满足&

八大排序算法(JAVA实现)

概论: 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我整理的八大排序就是内部排序. 当数据较多时应该采用时间复杂度为o(nlog2n)的排序方法:快速排序.堆排序.归并排序 快速排序是这几种内部排序中最好的方法,想待排序的关键字是随机分布时,快速排序的平均时间最短. 直接插入排序: 思想 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个

常用算法JS实现汇总

一.排序 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 二.查找 二分查找 三.其他 求区间问题 求第K大元素 寻找两数之和为sum的元素 平移数组 两数组第K值 数组去重 三色排序 盛水问题 数组分界值 买股票问题 随机红包问题 四.DP问题 Repost 数字三角形问题 最长递增子序列 0-1背包问题 连续子序列最大和 数字矩形最大路径和 爬楼梯 最长公共子串 最长公共子序列 *五.字符串 字符判重

算法之各种排序

算法之各种排序 本节内容 系统内置排序 冒泡排序 冒泡排序改进 双向排序 插入排序 希尔排序 归并排序 快速排序 1.系统内置排序 在python中使用内置方法对列表进行排序可以使用两种方法: 一种是列表提供的sort方法,该方法的特性是在原址进行排序,没有生成新的列表. 还有一种是python提供的内置方法sorted(),该方法接受一个序列,并返回一个排序好的序列,这种方式没有改变原序列的排序. 这里测试,使用的是list提供的sort内置方法.也就是原址排序. 在上面所列举的排序方式中,l

常见的数据结构与算法

数据结构 研究数据结构有什么用? 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构往往同高效的检索算法和索引技术有关. 数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构. 栈 队列 二叉树(满二叉树,完全二叉树,稀疏二叉树) 树 霍夫曼树.霍夫曼编码 图 图的存储表示(邻接矩阵,邻接表) 图的遍历.连通性(深度