排序算法2——折半插入排序

 

編寫折半插入排序算法,對元素序列 75、61、82、36、99、26、41進行從小到大排序。
【算法思想】
折半插入排序算法是對直接插入排序的一種改進。主要思想是在查找插入位置過程中引入折半查找算法思想,利用折半查找法在有序集中確定待排序元素插入位置。


【與直接插入排序的區別】
*直接插入排序:從右到左按照順序查找插入的位置。
*折半插入排序:在有序集中查找插入的位置。
【示例】
假設有7個待排序元素:75、61、82、36、99、26、41。使用折半插入排序算法對該元素序列進行第1趟排序過程,如圖1所示。


其中i=1表示第一趟排序,待排序元素爲a[1],t存放的是待排元素。當low>high時,low指向元素要插入的位置。依次將low---i-1之間的元素依次向後移一個位置,然後將t的值插入到a[low]中。

第二趟折半插入排序過程如圖2所示:

以上兩趟排序過程可以看出,折半排序與直接插入排序的區別僅僅在於查找插入位置的方法不同。一般情況下,折半查找的效率要高於順序查找的效率。

 

code:

#include<stdio.h>
#include <iostream>
using namespace std;
void PrintArray(int a[], int n);
void main()
{
	int a[] = { 75,61,82,36,99,26,41 };
	int t, i, j, low, high, mid, n;
	n = sizeof(a) / sizeof(a[0]);
	printf("折半插入排序前:\n");
	PrintArray(a, n);
	printf("折半插入排序:\n");
	for (i = 1; i < n; i++)
	{
		t = a[i];
		for (low = 0, high = i - 1; high >= low;)
		{
			mid = (low + high) / 2;
			if (t < a[mid])
				high = mid - 1;
			else
				low = mid + 1;
		}
		for (j = i - 1; j >= low; j--)
			a[j + 1] = a[j];
		a[low] = t;
		PrintArray(a, n);
	}


	system("pause");
}
void PrintArray(int a[], int n)
{
	int i;
	for (i = 0; i < n; i++)
		printf("%4d", a[i]);
	printf("\n");
}

結果:

 

【插入排序的鏈式實現】
L指向有序鏈表,p指向待排序鏈表。初始時,令L->next=NULL,即有序鏈表爲空。若有序鏈表爲空,則將p指向的結點直接插入空鏈表中。然後將p指向的第二個結點與L所指鏈表中的每一個結點比較,並將結點*p插入到L所指鏈表的相應位置,使其按有序排序。重複上述操作,直到待排序鏈表中所有結點都插入L所指向的鏈表,此時L就成爲一個有序鏈表。

 

首頁
博客
學院
下載
論壇
APP
問答
商城
活動
VIP會員

專題
招聘
ITeye
GitChat
圖文課
瘋狂Python精講
寫博客 消息

Markdown編輯器
富文本編輯器
查看主頁
內容
文章管理
專欄管理
評論管理
個人分類管理
博客搬家
數據
百度關鍵詞
自定義百度統計
設置
博客設置
自定義域名
博客模塊管理

CSDN博客交流羣

打開手機QQ掃碼
或點擊這裏加入羣聊

 
QQ客服

 
排序算法2.1——插入排序的鏈式實現
 18/100

文章標籤:
插入排序
數據結構與算法
添加標籤
最多添加5個標籤

個人分類:
插入排序
數據結構與算法
添加新分類
文章類型:
 *
博客分類:
 *
 申請原創將啓用(Creative Commons )版權模板,如果不是原創文章,請選擇轉載或翻譯
發佈形式:
  

void InsertSort(LinkList L)
{
    ListNode *p=L->next,*pre,*q;
    L->next=NULL;
    while(p!=NULL)
    {
        if(L->next==NULL)
        {
            L->next=p;
            p=p->next;
            L->next->next=NULL;
        }
        else
        {
            pre=L;
            q=L->next;
            while(q!=NULL&&q->data<p->data)
            {
                pre=q;
                q=q->next;
            }
            q=p->next;
            p->next=pre->next;
            pre->next=p;
            p=q;
        }
    }
}
 

【主要用途】
折半排序算法與直接排序算法一樣,通常也用於待排序元素的個數較少的情況。如果待排序序列基本有序,則最好採用直接插入排序算法。
【穩定性與複雜度】
折半排序也是一種穩定的排序算法。通常折半排序在查找插入的位置時改進了查找算法,減少了比較次數,但是移動元素的時間複雜度仍然沒有變,因此折半排序算法的整體時間複雜度仍然爲O(n*n)。空間複雜度爲O(1)。

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