改良插入排序

Posted 天秤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了改良插入排序相关的知识,希望对你有一定的参考价值。

/*
说明:
插入排序法由未排序的后半部分前端取出一个值,插入已排序前半部分的适当位置,概念简单但速度不快。
排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,Shell排序法即是基于此一概念来改良
插入排序法。

解法:
略 
*/

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

#define MAX 10
#define SWAP(x, y) {int t; t = x; x = y; y = t;}

void shellsort(int[]);

int main(void){
    int number[MAX] = {0};
    int i; 
    
    srand(time(NULL));
    
    printf("排序前: \n");
    for(i = 0; i < MAX; i++){
        number[i] = rand() % 100;
        printf("%d ", number[i]);
    }  
    
    shellsort(number);
     
//    system("pause");
    return 0;
}

void shellsort(int number[]){
    int i, j, k, gap, t;
    
    gap = MAX / 2;
    
    printf("\n排序后: \n");
    while(gap > 0){
        for(k = 0; k < gap; k++){
            for(i = k + gap; i < MAX; i += gap){
                for(j = i - gap; j >= k; j -= gap){
                    if(number[j] > number[j + gap]){
                        SWAP(number[j], number[j + gap]);
                    }
                    else{
                        break;
                    }
                } 
            }
        }
        
        printf("\n gap = %d: ", gap);
        for(i = 0; i < MAX; i++){
            printf("%d ", number[i]);
        }
        printf("\n");
        
        gap /= 2;
    }
} 

 

以上是关于改良插入排序的主要内容,如果未能解决你的问题,请参考以下文章

shell排序--改良的插入排序

希尔堆快排

排序02-直接插入排序法

[4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔

改良的选择排序

7种基本排序算法的Java实现