actanble

导航

Algorithm Gossip (34) 希尔排序

前言

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("\ngap = %d: ", gap);
		for(i = 0; i < MAX;i++)
			printf("%d ", number[i]);
		printf("\n");
		gap /= 2;
		}
	}

拓展和关联

后记

参考书籍

  • 《经典算法大全》
  • 维基百科

posted on 2017-04-14 21:34  白于空  阅读(111)  评论(0编辑  收藏  举报