两个吃奶一个添下面视频_人妻第一页香蕉网_欧美xxxx少妇_妺妺窝人体色www婷婷

希爾排序又稱“縮小增量排序”,是插入排序的一種。直接插人排序,當(dāng)待排序的記錄個(gè)數(shù)較少且待排序序列的關(guān)鍵字基本有序時(shí),效率較高。希爾排序基于以上兩點(diǎn),從“減少記錄個(gè)數(shù)”和“序列基本有序”兩個(gè)方面對(duì)直接插入排序進(jìn)行了改進(jìn)。

(1)步驟:

1. 先選定一個(gè)小于N的整數(shù)gap作為第一增量,然后將所有距離為gap的元素分在同一組,并對(duì)每一組的元素進(jìn)行直接插入排序。然后再取一個(gè)比第一增量小的整數(shù)作為第二增量,重復(fù)上述操作…

2. 當(dāng)增量的大小減到1時(shí),就相當(dāng)于整個(gè)序列被分到一組,進(jìn)行一次直接插入排序,排序完成。


(2)特點(diǎn):

1. 縮小增量

2. 多遍插入排序

3. 時(shí)間復(fù)雜度:O(n 1.3 n^{1.3}n 1.3 )

4. 空間復(fù)雜度:O(1)

5. 穩(wěn)定性:不穩(wěn)定


(3)動(dòng)圖演示:

這里重要的是理解分組思想,每一個(gè)組其實(shí)就是一個(gè)插入排序,相當(dāng)于進(jìn)行多次插入排序。


希爾排序算法

(4)C語(yǔ)言代碼實(shí)現(xiàn)如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int shell_sort(int arr[],int n)
{
    register int i, j, tmp;
    int step;

    for(step = n/2; step > 0;step /= 2)/*增量步長(zhǎng)*/
    {
        /*step = 4 2 1*/
        for(i = step; i < n; i++)
        {
            tmp = arr[i];
            j = i - step;
            for(;j >= 0 && tmp < arr[j];)
            {
                arr[j + step] = arr[j];
                j -= step;
            }
            arr[j + step] = tmp;

        }
    }
}

#define LENGTH 8

int main( int argc, int *argv[])
{
    int i;
    int arr[LENGTH] = {6,5,3,1,8,7,2,4};

    for(i=0;i<LENGTH;i++)
    printf("%d ",arr[i]);printf("\n");

    shell_sort(arr,LENGTH);

    for(i = 0;i < LENGTH;i++)
    printf("%d ", arr[i]);printf("\n");
}

如果我們編譯并運(yùn)行上述程序,那么它應(yīng)該產(chǎn)生以下結(jié)果:

6 5 3 1 8 7 2 4 
1 2 3 4 5 6 7 8
點(diǎn)贊(1)

C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:

一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程

解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程

從零到寫出一個(gè)爬蟲的Python編程課程

只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程

信息學(xué)奧賽或C++選手的 必學(xué)C++課程

藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程

手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程

Dotcpp在線編譯      (登錄可減少運(yùn)行等待時(shí)間)