前言
This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。
提出问题
34.Algorithm Gossip: Shell法 排序法 改良的插入排序
说明
插入排序法由未排序的后半部前端取出一个值,插入已排序前半部的适当位置,概念简单但速度不快。
排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,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("排序前:");
for(i = 0; i < MAX;i++){
number[i] = rand()% 100;
printf("%d ", number[i]);
}
shellsort(number);
return 0;
}
void shellsort(int number[]) {
int i, j, k, gap, t;
gap = MAX / 2;
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("
gap = %d: ", gap);
for(i = 0; i < MAX;i++)
printf("%d ", number[i]);
printf("
");
gap /= 2;
}
}
拓展和关联
后记
参考书籍
- 《经典算法大全》
- 维基百科