C語言希爾排序

希爾排序(Shell Sort)又稱“縮小增量排序”(Diminishing Increment Sort)是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

void ShellSort1(int* arr, int length)
{
	int i, j, gap;//步長
	for (gap = length / 2; gap >=1; gap /= 2)
		for (i = 0; i < gap; i++)        //直接插入排序
		{
			for (j = i + gap; j < length; j += gap)
				if (arr[j] < arr[j - gap])
				{
					int temp = arr[j];
					int k = j - gap;
					while (k >= 0 && arr[k] > temp)
					{
						arr[k + gap] = arr[k];
						k -= gap;
					}
					arr[k + gap] = temp;
				}
		}
}
void ShellSort2(int* arr, int length)
{
	int j, gap;
	for (gap = length/ 2; gap > 0; gap /= 2)
		for (j = gap; j < length; j++)//從數組第gap個元素開始
			if (arr[j] < arr[j - gap])//每個元素與自己組內的數據進行直接插入排序
			{
				int temp = arr[j];
				int k = j - gap;
				while (k >= 0 && arr[k] > temp)
				{
					arr[k + gap] = arr[k];
					k -= gap;
				}
				arr[k + gap] = temp;
			}
}
void ShellSort3(int* arr, int length)
{
    int i,j,gap;  //gap是步長
    for (gap = length / 2; gap >= 1; gap /= 2)   
        for (i = gap; i < length; i ++)//對步長爲gap的元素進行直插排序,當gap爲1時,直插排序
            for(j=i-gap;j>=0&&arr[j]>arr[j+gap];j-=gap)
                Swap(&arr[j],&arr[j+gap]);
}

時間複雜度:最佳情況O(n^1.3),最壞情況O(n^2),平均時間複雜度O(nlogn)~O(n^2)

空間複雜度:O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章