插入排序與堆排序分析

2021-07-26 08:57:23 字數 2808 閱讀 3805

選擇排序對大小為n的無序陣列r[n]進行排序,進行n-1輪選擇過程。首先將第1個元素作為已經排序好的子陣列,然後將剩餘的n-1個元素,逐個插入到已經排序好子陣列;。因此,在第 i輪排序時,前i個元素總是有序的,將第i+1個元素插入到正確的位置。

複製

純文字複製

#include

#include

#define n 8

void

insert_sort

(int a,

int n);

//插入排序實現,這裡按從小到大排序

void

insert_sort

(int a,

int n)

//n為陣列a的元素個數

//將元素插入到正確的位置

if(i != j)

//如果i==j,說明a[i]剛好在正確的位置

a[j]

= temp;}}

}int

main();

insert_sort

(num, n);

for(

int i=

0; i

printf

("%d "

, num[i]);

printf("

\n");system

("pause"

);return0;

}堆排序的時間複雜度是o(nlgn),是比較有效率的一種。其使用的是最大堆。最大堆的意思是父節點的值》=孩子的值。那麼第0個節點必定是該堆的最大值。所以,堆排序的思想就是每次迴圈把最大值移走,然後從剩下的節點重新建立最大堆。

第一步:建立堆的結構體。

[cpp]view plain

copy

print

?

typedef

struct heap_theap;  

typedef struct heap_theap;

其中arr指標指向的是存放堆資料的陣列。

heapmaxindex是陣列最大的序號。如陣列定義為a[10],那麼heapmaxindex的值應該為9.

第二步:保持堆的性質。

這一步是堆排序的基礎。這裡將功能寫成乙個函式名為void maxheapify(heap *hp, unsigned int nodei),這個函式用於讓乙個陣列變成乙個符合堆性質的陣列。時間複雜度為o(h),h是堆所屬二叉樹樹的高度=lgn(n是節點個數)。

思想是:從乙個節點i,和他的孩子leftchild(i),rightchild(i)中找到最大的,然後其索引存放在largest中。如果i是最大的。那麼i為根的子樹已經是最大堆,程式結束。

否則i的某個子節點有最大元素,那麼i的值和largest的值交換。下標為largest的節點在交換後作為父節點,那麼他可能又違反堆性質,因此遞迴呼叫該函式。

[cpp]view plain

copy

print

?

void maxheapify(heap *hp, unsigned int nodei)  

else  

}  

void maxheapify(heap *hp, unsigned int nodei)

else

}

第三步 利用maxheapify函式建立堆

對於1個個數為n的堆,從上面堆的圖中可以分析得到,n/2-1之前的都是父節點。之後的都是葉子節點,我們只需要對父節點進行maxheapify就可以了。

n/2可以用右移運算n>>1。

[cpp]view plain

copy

print

?

heap *createheap(int *arrp, int arrlength,heap *heap)  

heap *createheap(int *arrp, int arrlength,heap *heap)

第四步:堆排序

設堆的陣列為a[0..n-1],呼叫maxheapify函式就可以得到最大值,然後將最大值和n-1互換,把堆的大小heapmaxindex減1,再次呼叫maxheapify,又得到最大值,存放在a[0],再和a[n-2]互換,把堆的大小再減一,這樣迴圈下去,知道堆的大小為0。那麼我們就得到了由小到大的排好序的陣列。

void heapsort(heap *hp)  

}  

void heapsort(heap *hp)

}

測試堆排序

[cpp]view plain

copy

print

?

void printarr(int *p, int size)  

}  int main()  

;  printarr(a,20);  

printf("\n");  

heap hpa,*phpa;  

phpa =  createheap(a,20,&hpa);  

heapsort(phpa);  

printarr(a,20);  

putchar('\n');  

return 0;     

插入排序,希爾排序,堆排序

本文將介紹三種排序演算法 插入排序,希爾排序,堆排序。本文所有例子都是使用公升序 一.插入排序 演算法思想 維護乙個有序陣列,將要插入的資料與有序陣列自最後乙個元素直到合適位置的數一一比較。eg 有序陣列 1,3,5,6,7 現在待插入資料為2,那麼他將會和7,6,5,3,依次作比較,當帶插入資料小...

插入排序 歸併排序 堆排序

include void insertion sort int arr,int len arr j 1 temp int main int n 5 insertion sort a,n for int i 0 iprintf d a i includevoid merge sort recursiv...

插入排序 堆排序 快速排序實現

為什麼要排序 1.有時應用本身就需要對資訊進行排序。例如對財務報表進行排序 2.很多演算法通常把排序作為關鍵子程式,關鍵技術也體現在排序演算法中 演算法最壞情況執行時間 平均情況 期望執行時間 插入排序 o n 2 o n 2 堆排序o n lgn 快速排序 o n 2 o n lgn 1.插入排序...