算法练习--直接插入排序、希尔排序

背景:

  原来虽然有学过数据结构,排序一些,但是没有好好学,现在复习一下。

正题:

  1、直接插入排序

    直接贴一下百科:每次取出无序数组中的一个数,把他和有序数组中的数比较,插到适当位置,直到无序表为空,有序表满。

    原理很简单,就我而言,首先想到的是新建一个new_list数组,充当有序表,然后一步一步将无序表里的值拿出来放到新的数组中。但是,写完之后,看了看书上的实例,  上面直接用单数组也可以,虚拟划分数组为两部分。代码简便多。于是很我也修改了一下自己的代码。

    代码如下:

<?php

function STR_I_sort($list)
{
    array_unshift($list , 0);

    for($i = 1; $i < count($list); $i++)
    {
        $list[0] = $list[$i];
        $j = $i - 1;
        while($j > 0 && $list[0] < $list[$j])
        {
            $list[$j+1] = $list[$j--];
        }
        $list[$j+1] = $list[0];
    }
    array_shift($list);
    return $list;
}

$list = array(36,25,48,12,65,43,20,36);
print_r(STR_I_sort($list));
//Array ( [0] => 12 [1] => 20 [2] => 25 [3] => 36 [4] => 36 [5] => 65 [6] => 43 [7] => 48 )
?>

    其中对数组添加了一个list[0],目的是为了存储当前想要插入的值,一面数组向后移动时覆盖掉该值。百科上说,可以用list[0]控制数组越界,不过我没什么特别大的感觉。。

  2、希尔排序

    原理:先取一个小于n的整数d1作为第一个增量,把数据分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量  =1(  < …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。(增量序列取值是一个有待考究的问题,不过为了简便一些,使用 =  / 2)

    希尔排序其实是对直接插入排序的一中改进,对于直接插入排序,如果给出序列越接近有序,那么直接插入排序的效率就越高。因此,采用这种分组的方式,先让每一组有序,直到最后完全有序。其中我认为麻烦的一点就是如何将每个组都进行直接插入排序。开始想的是每个组提取出来单独的进行排,但是发现不太可行。于是看了看实现方法,发现都是交替并按照原序列下标顺序进行替换操作。

    代码如下:

<?php
function Shell_sort($list)
{
    $count = count($list);
    $step = floor($count/2);        //步长

    while($step > 0)
    {
        for($i = $step ; $i < $count ; $i++)
        {
            $j = $i - $step;
            while($j>=0 && $list[$j] > $list[$j+$step])
            {
                $tmp = $list[$j];
                $list[$j] = $list[$i];
                $list[$i] = $tmp;

                $j = $j - $step;
            }
        }
        $step = floor($step/2);
    }
    return $list;
}

$list = array(165,12316,123,496,1265,123,456,1515);
print_r(Shell_sort($list));
//Array ( [0] => 123 [1] => 123 [2] => 165 [3] => 456 [4] => 496 [5] => 1265 [6] => 1515 [7] => 12316 )
?>

over。这几天准备把排序系统都看一看,然后再去看点好玩的题目。

时间: 2024-10-09 21:20:02

算法练习--直接插入排序、希尔排序的相关文章

插入排序) 希尔排序 (最小增量排序)

/** * (插入排序) 希尔排序 (最小增量排序) * @author Cinn * */public class shellSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        shlees

让算法会说话之希尔排序

这是我参照之前在iOS项目中用过的一个不规则形状按钮的第三方Button,这里用Cocos2d-x实现一个相似功能的按钮. 原文地址:http://blog.csdn.net/qqmcy/article/details/26161339 代码下载:http://download.csdn.net/detail/qqmcy/7365843 使用方法: .h // // TestScene.h // maptest // // Created by 杜甲 on 14-5-18. // // #ifn

算法-java代码实现希尔排序

希尔排序 第8节 希尔排序练习题 对于一个int数组,请编写一个希尔排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组.保证元素小于等于2000. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class ShellSort { 4 public int[] shellSort(int[] A, int n) { 5 int

经典排序算法学习笔记四——希尔排序

一.希尔排序 数据结构 数组 最差时间复杂度 根据步长序列的不同而不同.已知最好的:O(n*log ^{2}n) 最优时间复杂度 O(n) 平均时间复杂度 根据步长序列的不同而不同. 最差空间复杂度 O(n) 1.算法思想: 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: 然后取d2<d1,重复上述分组和排序操作: 直至di=1,即所有记录放进一个组中排序为止. 我是栗子,栗子,栗子 假设有这样一组数[ 13 14 94 33 82 25 59 94 65

插入排序—希尔排序(Shell`s Sort)原理以及Java实现

希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序 基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序. 操作方法: 选择一个增量序列t1,t2,-,tk,其中ti>tj,tk=1: 按增量序列个数k,对序列进行k 趟排序: 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序.仅增量因子为

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

排序算法(六)——希尔排序

基本思想 希尔排序是基于插入排序的,又叫缩小增量排序. 在插入排序中,标记符左边的元素是有序的,右边的是没有排过序的,这个算法取出标记符所指向的数据,存入一个临时变量,接着,在左边有序的数组中找到临时变量应该插入的位置,然后将插入位置之后的元素依次后移一位,最后插入临时变量中的数据. 试想,假如有一个很小的数据项在靠近右端的位置上,把这个数据项插入到有序数组中时,将会有大量的中间数据项需要右移一位,这个步骤对每一个数据项都执行了将近N次复制.虽然不是所有数据项都必须移动N个位置,但是,数据项平均

内部排序-&gt;插入排序-&gt;希尔排序

文字描述 希尔排序又称缩小增量排序,也属于插入排序类,但在时间效率上较之前的插入排序有较大的改进. 从之前的直接插入排序的分析得知,时间复杂度为n*n, 有如下两个特点: (1)如果待排序记录本身就是"正序"时, 其时间复杂度可减少为n. (2)当待排序记录数很小时,直接插入排序的效率也比较高; 希尔排序正是从这两点分析出发对直接插入排序进行了改进.它的基本思想是:先将整个待排记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全

PHP 插入排序 -- 希尔排序

1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值.适用的情况凭个人感觉用吧,我也不知道,反正,我并不认为自己是一个程序员,喜欢凭感觉行事. 1 <?php 2 $arr = [3,4,5,1,11,9,27,27,18,20]; 3 4 5 function shellSort(array &$arr,$dt) 6 { 7 // 跟增量相关,

自己整理的算法 (7) 希尔排序

package sort; /**希尔排序的原理:根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较大值移到前面,较小值 * 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强 * 版的插入排序 * 拿数组5, 2, 8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列 * 5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increme