排序算法(三) 直接插入排序與折半插入排序

一、什麼是插入類排序?

        插入類排序默認有一個已經排好序的序列,而後面的操作就是將未排好序的元素有序插入到已排好序的序列中。

 將所有未排好序的元素插入到合適位置,即可得到一個有序序列。

二、需要了解的幾類插入類排序算法。

       (1)、直接插入排序

                    直接插入排序是一種基本的插入排序算法。算法思路很簡單!以升序爲例:


              <1>、 將序列的第一個元素看成一個有序序列(任何一個單元素都可以看成有序序列)。


              <2>、 從第二個元素開始向後遍歷。 將第二個元素插入到第一個元素的前面(如果比第一個元素小),否則置不變。


              <3>、 然後繼續看第三個元素,此時前兩個元素是按升序有序的。將第三個元素按順序和第二個元素、第一個元素進行比較,將其放入合適的位置。


              <4>、 直到最後一個元素也被放入前面的有序序列的合適位置,那麼排序完成。

              過程如下圖 :

                           

直接插入排序源代碼 :

/*
**功能: 直接插入法升序排序一個序列
**參數說明:
**@record : 序列數組 @len : 序列長度
**返回值: 無
*/
void InsertSort(int record[], int len)
{
	int i, j;
	int value;   //存儲待插入元素值

	//從第二個元素開始插入排序,第一個元素默認是有序的
	for (i = 1; i < len;i++)
	{
		value = record[i];

		//尋找合適的插入位置
		j = i - 1;
		while (j >= 0 && record[j] >= value)
		{
			record[j + 1] = record[j];
			j--;
		}

		//將待排元素插入到合適的位置
		record[j + 1] = value;
	}
}


       (2)、折半插入排序

                    折半插入與直接插入很像!唯一的區別在於它尋找插入位置的方法不同,直接插入是對有序表進行順序遍歷查找,而折半插入中的“折半”就體現在此處,它尋找插入位置是進行折半查找。大大增加了查找效率,但未改變移動元素的時間耗費。


折半插入排序源代碼:

void BinSort(int record[], int len)
{
	int i, j;
	int value;   //存儲待插入元素值
	int low, high, mid;  //用於折半查找的變量

	//從第二個元素開始插入排序,第一個元素默認是有序的
	for (i = 1; i < len;i++)
	{
		value = record[i];

		//折半法尋找插入位置
		low = 0;
		high = i - 1;
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (value < record[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}

		//移動元素,爲放置待排元素騰位置
		for (j = i - 1; j >= low;j--)
		{
			record[j + 1] = record[j];
		}

		//將待排元素插入到合適的位置
		record[low] = value;
	}
}
int main(void)
{
	int record[] = { 48,62,35,77,55,14,35,98 };
	int len = sizeof(record) / sizeof(record[0]);
	int i = 0;

	printf("排序前: \n");
	for (i = 0;i < len;i++)
	{
		printf("%d  ", record[i]);
	}
	puts("");

	BinSort(record, len);

	printf("排序後: \n");
	for (i = 0;i < len;i++)
	{
		printf("%d  ", record[i]);
	}
	puts("");

	return 0;
}

運行截圖 :
                                




       (3)、希爾排序(放在下一篇講解)


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