排序算法: 插入排序法(直接插入法和希尔排序法)

1, 直接插入法:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。由于碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

实现思路:

1,把第一个数看成有序序列,从数组第二个开始向后遍历,即i=1,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置;

2,当从第i个数向前遍历时,将a[i]保存在temp中,然后令j=i,首先temp与第(j-1)个数比较

(1)如果temp>a[j-1],说明序列已经有序,i++进入下一个循环外;

(2)如果temp<a[j-1], 将a[j-1]后移,j--进入下一个内循环,最终将temp存人合适位置;

(3)进行(1)(2)步骤,直到排序完成;

原始数据:

0 1 2
6 10 4

1, i=1, temp=a[i]=10;  由于j=i , temp>a[j-1]=6, 此时(i++)-->2


0


1


2


6


10


4

 

2,初始 i=2, temp=a[i]=4;

(1) 由于j=i=2, temp<a[j-1]=10, 此时a[j-1]后移,a[j]=a[j-1], (j--)-->1


0


1


2


6


10


10

(2)j=1, temp<a[j-1]=6, 此时a[j-1]后移,a[j]=a[j-1], (j--)-->0, a[j]=temp, 循环退出


0


1


2


4


6


10

代码实现:

void simple_insertSort(int array[], int n)
{
    int i, j, temp;

    for(i=1; i<n; i++)
    {
        temp = array[i];
        for(j=i; j>0; j--)
        {
             if(temp < array[j-1])
                 array[j] = array[j-1];
             else
                 break;
        }
        array[j] = temp;
    }
}

2, 希尔排序法:将无序数组分割为若干个子序列,序列按照一定间隔(d)分成子序列,并对子序列进行插入排序;然后再选择一个更小的间隔(d=d/2),再将数组分割为多个子序列进行排序,最后选择增量为1,此时可以直接使用“直接插入排序”,使最终数组获得有序序列。

希尔排序法过程:

5  10  8  60  3  1  90  7

第一次分组:间隔为8/2=4

5------------------------3

-----10-----------------------1

------------8-----------------------90

-----------------60-----------------------7

排序后:

3  1  8  7  5  10  90  60

第二次分组:间隔4/2=2

3----------8----------5-----------90

-----1----------7----------10------------60

排序后:

3  1  5  7  8  10  90  60

第三次分组:间隔2/2=1,直接使用“直接插入法”

3----1----5----7----8----10----90----60

排序后:

1  3  5  7  8  10  60  90  

实现代码:

/**************************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 *************************************************************************************/
int shell_sort (int* s, int len)
{
    int d;
    int i,temp,j;
    d = len / 2;

    while(d > 0)
    {
        i = d;
        while(i < len)
        {
            j = i;
            while(j > 0)
            {
                if(s[j-d] > s[j])
                                {
                    temp = s[j-d];
                    s[j-d] = s[j];
                    s[j] = temp;
                    j = j-d;
                }
                else
                    break;
            }
            i++;
        }
        d = d / 2;
    }

    return 0;
} /* ----- End of shell_sort()  ----- */

参考链接:

http://blog.csdn.net/wswifth/article/details/5829156

http://blog.csdn.net/cjf_iceking/article/details/7951481

时间: 2024-10-02 05:53:28

排序算法: 插入排序法(直接插入法和希尔排序法)的相关文章

排序之插入排序:直接插入和希尔排序

一.插入排序 1.思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动 2.时间复杂度: 最好:O(N),正序情况,只有比较时间,无移动时间 最坏:O(N2),逆序情况 平均:O(N2) 3.辅助空间:O(1) 4.稳定性:稳定 5.适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高 1 public static void insertSort(int[] a) { 2 int target,i,j; 3 for(j = 1;j<a.l

算法学习之排序算法(四)(希尔排序)

1.算法思想 先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 希尔(Shell)排序又称为缩小增量排序,它是一种插入排序.它是直接插入排序算法的一种威力加强版. 希尔排序的基本思想是 把记录按步长 gap 分组,对每组

排序---内部排序算法(快排、希尔排序、归并排序、基数排序、冒泡、选择排序)比较

1.内部排序的复杂度总结 1)时间复杂度 4种排序的平均时间复杂度是O(nlog2n),"快些以nlog2n的速度归队"(快排.希尔排序.归并.堆排序) 最坏情况下,快排的时间复杂度为O(n*n) 2)空间复杂度 O(log2n)快排 O(n)归并 O(rd)基数 其他都是O(1) 3)稳定性 不稳定的:"考研复习痛苦啊,情绪不稳定,快些选一堆好友来聊天吧"(快排.希尔.简单选择排序.堆排序) 其他都是稳定的. 4)一趟排序,保证一个关键字到达最终位置 交换类(起泡

排序算法 插入排序(直接插入排序、半插入排序、希尔排序)

一.直接插入排序. 1.介绍. 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列.例如,已知待排序的一组记录是:60,71,49,11,24,3,66.假设在排序过程中,前3个记录已按关键码值递增的次序重新排列,构成一个有序序列:49,60,71.将待排序记录中的第4个记录(即11)插入上述有序序列,以得到一个新的含4个记录的有序序列.首先,应找到11的插入位置,再进行插入.可以

经典排序算法 – 插入排序Insertion sort

经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行.   图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 以下代码仅供参考,欢迎指正 /// <summary> /// 插入排序 /// </summary> /// <param na

【排序算法】用C++实现各种排序算法

1. 在平时的学习中,很经常听到各种排序算法,各自有其优缺点.尝试自己用C++实现各排序算法,作为对算法的基础学习. 常见的内部排序: 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序 [排序算法]用C++实现各种排序算法

排序算法分析【二】:希尔排序(附Python&amp;C++代码)

希尔排序 也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率: 2.插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位: 算法原理 基础是插入排序,我们先看图,图片动态展示: 这个图太快了还是不知道他在干嘛,在给一张图(图片均来自互联网): 步长选择 希尔排序中步长的选择是重中之重![来自于维基百科] 1.最终步长必

各种排序算法总结篇(高速/堆/希尔/归并)

1.高速排序 交换排序有:冒泡(选择)排序和高速排序,冒泡和选择排序的时间复杂度太高,思想非常easy临时不讨论.高速排序基于一种分治的思想,逐步地使得序列有序. #include <iostream> #include <conio.h> using namespace std; int arrs[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 }; int arrLen = sizeof(arrs) / sizeof(ar

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }