插入排序之----shell排序

shell排序是插入排序的一種,在時間效率上有較大的改進。是一種不穩定的排序方法。

基本思想:選定第一個增量d1 < n,把全部記錄按此值從第一個記錄起進行分組,所有相距爲d1的記錄作爲一組,先在各組內進行插入排序,然後減小間隙,取第二個增量d2 < d1,重複上述分組和排序過程,直到增量d爲1爲止,即所有的距離放在同一組內排序。

算法的思路:

shell排序算法通過三重循環實現;

1.外循環以各種不同的間隔距離d進行循環,直到d=1爲止。

2.第二重循環是在某一個d值下對所分的組進行組循環

3.第三重循環是對第二重循環中所分的每個組,進行組內循環。

 

算法實現:

#include<stdio.h>
#define Type int  //可以換爲char

void shell_insert(Type *buf, int n)
{
	Type x;
	int i,j,d;
	d = n / 2;     //定義增量
	while(d >= 1)  //第一趟循環,以不同的d進行循環
	{
		for(i = d; i < n; i++)  //第二趟循環,循環不同的組,應用直接插入排序
		{
			x = buf[i];
			j = i - d;
			while((j > 0)&&(x < buf[j])) //第三趟循環,組內排序,
			{
				buf[j + d] = buf[j];
				j = j -d;
			}
			buf[j+d] = x;
		}
		d = d / 2;  //再次劃分增量d
	}
}

int main()
{
	int i;
	Type num[11] = {1,11,23,32,24,3,5,8,10,16,22};  //"asdfghjkloq"

	printf("Original array:");
	for(i = 0; i < 11; i++)
		printf("%d ", num[i]); //注意輸出格式的替換
	printf("\n");
	
	shell_insert(num, 11);

	printf("Sorted array:");
	for(i = 0; i < 11; i++)
		printf("%d ", num[i]); //注意輸出格式的替換
	printf("\n");

	return 0;
}


 

 

發佈了42 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章