【改良插入排序】

Shell排序法详解
本文介绍了一种改进的插入排序算法——Shell排序法。通过逐步缩小间隔进行多次排序,利用了前次排序的结果来加速后续排序过程。代码示例展示了如何在C语言中实现该算法,并给出运行结果。
/*
说明:
插入排序法由未排序的后半部分前端取出一个值,插入已排序前半部分的适当位置,概念简单但速度不快。
排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,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;
    }
} 

 

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值