希爾排序

算法介紹
希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因 DL.Shell 於1959 年提出而得名。

基本思想
先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的) 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 (增量足夠小)時,再對全體元素進行一次直接插入排序。因爲直接插入排序在元素基 本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前三 種方法有較大提高。

案例
第一輪排序,如圖
第一輪排序

//
//  希爾排序
//  Created by 劉龍玲 on 16/5/14.
//  Copyright © 2016年 liulongling. All rights reserved.
//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10

//打印函數
void PrintArray(int arr[], int length){
    for (int i = 0; i < length; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

//從小到大排序
void ShellSort(int arr[], int length){

    int a = length;
    int k = 1;

    while(a > 1)
    {
        //確定分組的增量
        a = a / 2;
        for(int i = 0; i < a;i++)
        {
            for(int j = i+a;j<length;j+=a)
            {

                int temp =arr[j];
                int x;
                for(x = j - a;x>=0&&arr[x] > temp;x=x-a)
                {
                    arr[x+a]=arr[x];
                }
                arr[x+a]=temp;

            }

        }
        printf("第%d輪排序結果:",k++);
        PrintArray(arr,MAX);
    }
}


int main(void){

    int arr[MAX] ={9,0,2,6,1,7,8,4,3,4};

    printf("%s \n","排序前");
    PrintArray(arr, MAX);
    ShellSort(arr, MAX);
    printf("%s \n","排序後");
    PrintArray(arr, MAX);
    return 0;
}

運行結果
排序前
9 0 2 6 1 7 8 4 3 4
第1輪排序結果:7 0 2 3 1 9 8 4 6 4
第2輪排序結果:1 0 2 3 6 4 7 4 8 9
第3輪排序結果:0 1 2 3 4 4 6 7 8 9
排序後
0 1 2 3 4 4 6 7 8 9

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章