算法之-归并排序算法,插入排序算法

一、归并排序法

归并排序是效率还是比較高的算法。当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用。

所谓的分治法,字面解释就是“分而治之”,就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解。原问题的解即子问题的解的合并。这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候。

归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组。

归并排序的算法思路为:

第一次扫描数组,将数组中相邻的两个元素merge为有序数组

第二次扫描,将相邻的有序数组再合并为更大的一个有序数组

再进行n次扫描,不断合并数组,直到排序完毕

当中的归并操作merge的思路是:

设定两个指针,最初位置分别为两个已经排序序列的起始位置

比較两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

反复步骤3直到某一指针达到序列尾

将还有一序列剩下的全部元素直接拷贝到合并序列尾

好了我们依照上面的思路来用PHP实现归并排序算法:

<?php
//归并排序算法
//首先定义归并操作merge函数
function merge($arr1,$arr2){
   $arr3=array();
   while(!empty($arr1) && !empty($arr2)){
       $arr3[]=$arr1[0]<=$arr2[0]?

array_shift($arr1):array_shift($arr2);
   }
   $arr3=array_merge($arr3,$arr1,$arr2);
   return $arr3;
}

//归并排序
function merge_sort($newarray){
    if(count($newarray)<=1) return $newarray;
    $middle=intval(count($newarray)/2);
    $arr1=array_slice($newarray, 0,$middle);
    $arr2=array_slice($newarray, $middle);
    return merge(merge_sort($arr1), merge_sort($arr2));
}

$arr = array(9,8,7,6,5,8,7);
print_r( merge_sort($arr));

越来越发现递归算法的重要性,熟练应用递归能够解决非常多实际的问题。

关于递归的理论能够參考http://www.cnsecer.com/4146.html

二、插入排序法

插入排序(Insertion Sort)的算法描写叙述是一种简单直观的排序算法。它的工作原理是通过构建有序序列。对于未排序数据。在已排序序列中从后向前扫描,找到对应位置并插入。

插入排序在实现上。通常採用in-place排序(即仅仅需用到O(1)的额外空间的排序)。因而在从后向前扫描过程中,须要重复把已排序元素逐步向后挪位,为最新元素提供插入空间。

一般来说,插入排序都採用in-place在数组上实现。详细算法描写叙述例如以下:

  1. 从第一个元素開始,该元素能够觉得已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 假设该元素(已排序)大于新元素,将该元素移到下一位置
  4. 反复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 反复步骤2~5

假设比較操作的代价比交换操作大的话,能够採用二分查找法来降低比較操作的数目。

该算法能够觉得是插入排序的一个变种,称为

title=%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E6%8E%92%E5%BA%8F&action=edit&redlink=1" class="new" title="二分查找排序(页面不存在)" style="text-decoration:none; color:rgb(165,88,88); background-color:initial">二分查找排序

function insert_sort($arr) {
    //区分 哪部分是已经排序好的
    //哪部分是没有排序的
    //找到当中一个须要排序的元素
    //这个元素 就是从第二个元素開始,到最后一个元素都是这个须要排序的元素
    //利用循环就能够标志出来
    //i循环控制 每次须要插入的元素。一旦须要插入的元素控制好了,
    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
    for($i=1, $len=count($arr); $i<$len; $i++) {
        //获得当前须要比較的元素值。
        $tmp = $arr[$i];
        //内层循环控制 比較 并 插入
        for($j=$i-1;$j>=0;$j--) {
   //$arr[$i];//须要插入的元素; $arr[$j];//须要比較的元素
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置
                //将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                //将前面的数设置为 当前须要交换的数
                $arr[$j] = $tmp;
            } else {
                //假设碰到不须要移动的元素
           //因为是已经排序好是数组。则前面的就不须要再次比較了。

break;
            }
        }
    }
    //将这个元素 插入到已经排序好的序列内。
    //返回
    return $arr;
}
时间: 2024-10-22 07:56:48

算法之-归并排序算法,插入排序算法的相关文章

python实现排序算法(一)——插入排序算法

1 ''' 2 插入排序算法 3 原始数据data 4 排序数据后数据SortedData,默认是从小打大排序 5 6 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被排序 7 8 2.取出data的一个元素data[i], 9 (1)从左到右扫描SortedData, 10 如果data[i]小于SortedData的某个元素SD,那么将data[i]插入SD的位置,选取下一个元素 11 (1)如果data[i]大于SortedData最

排序系列 之 折半插入排序算法 —— Java实现

基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找. 实例: (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.htm

【排序】插入排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 一:插入排序算法思想 01.设待排序序列为 .插入排序将  划分为由已排序好序的  部分 以及 未排序的  部分组成: 注意:刚开始时  部分其实可认为只有一个元素,即: 元素 02.排序开始时,每次从  序列中(随机,但一般是直接取第一个元素)取出一个元素 ,将其插入到已排好序  部分的"适当位置 ",使得以下条件成立:      ,{ 1  x  i  

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

算法题——归并排序的原地实现

普通的归并排序,需要一个额外的数组来保存每次merge的结果:如果要求不使用额外空间,那么每次merge的时候需要做一些处理. 思路: 合并left[] 和 right[]时,假如right[0]应该放入left[3],那么:①可以用一个var来保存right[0],然后将left[3]之后的元素右移一次,再将var值放入left[3]:②也可以交换right[0]和left[3]的值,然后left[0]在新的位置向后遍历,找到合适的位置,再把前面的移位.    寻找合适位置的过程是一次插入排序

算法-4.归并排序(自顶向下)

1.基本思想 将两个有序的数组归并成一个更大的有序数组,很快人们就根据这个操作发明了一种简单的递归排序算法:归并排序.要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来.你将会看到,归并排序最吸引人的性质是它能够保证将任意长度为N的数组排序所需时间和NlogN成正比:它的主要缺点则是它所需的额外空间和N成正比.简单的归并排序如下图所示: 原地归并的抽象方法: 实现归并的一种直截了当的办法是将两个不同的有序数组归并到第三个数组中,实现的方法很简单,创建一个适当大小的数组然后

常见的排序算法(一) 插入排序

插入排序分为:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 在这里我具体讲直接插入排序和希尔排序. 直接排序插入 直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位置.直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的.当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数

插入排序算法回顾(python实现)

插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止. 折半插入排序是对插入排序算法的一种改进,由于排序算法过程中,就是不断的依次将元素插入前面已排好序的序列中.由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度.具体操作为:在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与

插入排序算法的学习

插入排序算法: 例如序列:5,6,3,7,8,2 采用插入排序算法对序列进行排序, 具体步骤如下: 第一步: 将6单独提取出来,放在一个变量中去寄存: 然后让5与寄存项进行比较,不满足前项大于寄存项,保持原有序列不变 序列为:5,6,3,7,8,2 第二步: 将3单独提取出来,放在一个变量中去寄存: 然后让6与寄存项进行比较,满足前项大于寄存项,将3位置用6覆盖掉: 序列为:5,6,6,7,8,2 然后将5与寄存项进行比较,满足前项大于寄存项,将第一个6位置用5覆盖掉: 序列为:5,5,6,7,