希尔排序(插入排序的改进)C++实现

算法描述:

相对于直接插入排序,希尔排序将数组元素按下标的一定增量分组,对每组进行直接插入排序,随着增量的不断减小,每组包含的元素也就越多,当增量为1时,整个数组被分为一个组,进行直接插入排序之后结束。

下面给出随机整数数组的希尔排序C++实现:

#include <iostream>
#include <math.h>
using namespace std;
const int Num=20;
void exch(int* s,int a,int b)
{
        int mid=s[a];
        s[a]=s[b];
        s[b]=mid;
}
int main()
{
int array[Num];
srand(3);//初始化随机数
for(int i=0;i<Num;i++)//初始化数组0到100之间
{
        array[i]=rand() % 101;
}
for(int i=0;i<Num;i++)//输出原数组
{
        printf("%d ",array[i]);
}
int step=1;
while(step<Num/3)
{
        step=step*3+1;
}
while(step>=1)//希尔排序
{
        for(int i=step;i<Num;i++)
        {
                for(int j=i;j>=step;j-=step)
                {
                        if(array[j]<array[j-step])
                                exch(array,j,j-step);
                }
        }
        step/=3;
}
printf("\n");
for(int i=0;i<Num;i++)
{
        printf("%d ",array[i]);
}
    return 0;
}

希尔排序的更高效的原因是它权衡了子数组的规模和有序性。排序之初,个子数组都很短,排序之后每个子数组都是部分有序的,这两个情况都很适合插入排序。

时间: 2024-08-01 05:29:00

希尔排序(插入排序的改进)C++实现的相关文章

快速排序 &amp;&amp; 希尔排序 &amp;&amp; 插入排序

1. 快速排序 不稳定的排序. 平均(与最好情况)时间复杂度:O(nlgn)   |  最坏情况时间复杂度(元素有序,递归栈为 O(n)):O(n2) 适合的数据结构:数组,双向链表. #include <stdio.h> #include <stdlib.h> int partition(int data[], int low, int high) { int value = data[low]; // can be done randomly while(low < hi

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序算法-希尔排序

希尔排序,插入排序的升级排版 先回顾插入排序 1从集合第二个元素开始(外循环开始) 2取出该元素 标记为C 3从该元素开始,向前遍历,如果元素大于C,则该元素向后移动一位(内循环) 4直到找到一个小于或者等于C元素(或者到达集合头部),将C放在这个元素的下一位(或者集合头部) 重复1(注意选取下一个元素)(外循环第一趟完成,进入第二趟循环) 可以发现问题: 数组:  5,1,2,3,4,0,6,7,8,9 按照从小到大排序会使得多个元素交换位子,这是比较消耗性能的,这里使用希尔排序会高效很多 希

【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)

插入排序基本思想 每次将一个待排序的记录按其关键字大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完成为止. 直接插入排序 基本思想 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的有序表.即假设待排序的记录存放在数组R[1······n]中,排序过程中,R被分成两个子区间R[1······i]和R[i+1······n],其中,R[1······i]是已经排好序的有序区:R[i+1······n]是当前未排序的部分.将当前无序区的第一个记录R[i+1]插

插入排序算法之直接插入排序和希尔排序

插入排序算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. 直接插入排序 直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入. 例子: 有序列: 开始时,有序序列只有一个元素就是第一个元素(红色),后面的无序序列(绿色).接下来,取无序序列中

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 // 跟增量相关,

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

背景: 原来虽然有学过数据结构,排序一些,但是没有好好学,现在复习一下. 正题: 1.直接插入排序 直接贴一下百科:每次取出无序数组中的一个数,把他和有序数组中的数比较,插到适当位置,直到无序表为空,有序表满. 原理很简单,就我而言,首先想到的是新建一个new_list数组,充当有序表,然后一步一步将无序表里的值拿出来放到新的数组中.但是,写完之后,看了看书上的实例, 上面直接用单数组也可以,虚拟划分数组为两部分.代码简便多.于是很我也修改了一下自己的代码. 代码如下: <?php functi

java排序之插入排序(直接插入排序和希尔排序)

上面一片博文探讨了关于的java选择排序(冒泡排序和快速排序)本章将继续探讨java排序之插入排序,插入排序分为直接插入排序和希尔排序两种. 1.直接插入排序思想:在需要排序的一组数据中假设前该数组的前n-1(n >= 2)个数是已经排好序的,现在要把第n个数插入到前面的n-1个数中,使得这n个数也是排好顺序的.如此反复进行,知道n等于需要排序的数组的长度时.就实现了该数组的直接插入排序. 代码如下: /** * * @param a 需要排序的数组 */ public static void

#排序算法#【2】直接插入排序、希尔排序

直接插入排序法 插入排序的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后移动,为最新元素提供插入空间. 核心代码: //直接插入排序法 void InsertSort(int a[],int n){ int i,j,k,t; for(i = 1 ; i<n;i++){ k = a[i]; /* 第一次比较粗糙的写法 j = i-1; while(