插入排序和希爾排序(C語言)

插入排序和希爾排序(C語言)

996.icu LICENSE

  • 插入排序
  • 希爾排序

閱讀之前注意:

本文閱讀建議用時:20min
本文閱讀結構如下表:

項目 下屬項目 測試用例數量
插入排序 1
希爾排序 1

插入排序

插入排序的關鍵在於:

  1. 當前元素前面的序列都是有序的,再把當前元素插入到這個有序序列中,於是形成多了一個元素的有序序列
  2. 再把這個有序序列後的元素看成當前元素,重複步驟1,直至有序序列後沒有元素,即完成了整個序列的排序
    參考以下代碼:
#include<stdlib.h>
#include<stdio.h>

void insertSort(int *a,int n)//插入排序
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	int time = 0;
	for (i = 1; i < n; i++)
	{
		tmp = a[i];
		for (j = i ; (j > 0 && tmp<a[j-1]); j--)
		{
			a[j] = a[j - 1];//a[j-1]元素後移
			time++;
		}
		a[j] = tmp;
	}
	printf("move times:%d\n", time);
}

void main()
{
	int a[10] = { 1, 5, 9, 7, 2, 3, 6, 8, 4, 0 };
	insertSort(a, 10);
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]);
	system("pause");
}

在代碼的insertSort()函數體中,我加入了一個time的變量來計數元素移動的次數。

希爾排序

希爾排序相對於插入排序而言,加入了數據分組的思想。這樣就使得相距較遠的元素也能很快的交換到對應的位置,而不必像插入排序一樣一個一個的往前交換,從而減少了交換的次數。
參考以下代碼:

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

void shellSort(int *a,int size)//希爾排序
{
	int gap = size;
	int i = 0;
	int j = 0;
	int tmp = 0;
	int time = 0;
	do
	{
		gap = gap / 3 + 1;
		for (i = gap; i < size; i++)//這裏即基礎的插入排序
		{
			tmp = a[i];
			for (j = i; (j > 0) && (tmp < a[j - gap]); j -= gap)
			{
				a[j] = a[j - gap];
				time++;
			}
			a[j] = tmp;
		}
	} while (gap > 1);
	printf("move times:%d\n", time);
}

void main()
{
	int a[10] = { 1, 5, 9, 7, 2, 3, 6, 8, 4, 0 };
	shellSort(a, 10);
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]); 
	system("pause");
}

運行以上程序,可以看到希爾排序交換的次數更少,或者說其時間複雜度降下來了。1

如果本文對你有幫助,不如請我一罐可樂吧 🍼
在這裏插入圖片描述


  1. 程序基於王保明先生的講課內容. ↩︎

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