演算法導論記錄本

2021-06-26 19:46:54 字數 4013 閱讀 1133

過程描述:待排序序列數分為兩部分,一部分為已排好序序列,一部分未排好,初始時,已排好個數為1。

從未排好序序列第乙個數開始迴圈,如果已排好序列中的數大於第乙個數,將該數右移,直到

遇見小於等於第乙個數的數值,那麼在該位置插入為未排序序列中的第乙個數,之後的從第二

個數開始,重複過程,直到遍歷完所有的數。

其中已排好序系列稱為迴圈不變式,只要證明迴圈不變式在三個條件下成立,那麼該演算法設計就

是正確的,這三個條件分別是初始化,保持和終止。

插入排序偽**過程如下:

順序排列

insert-sort(a)

for j = 1 to a.length

key = a[j]

i = j -1

while(a[i] > key && i > -1)

a[i+1] = a[i]

i = i - 1

a[i+1] = key

演算法分析:插入排序的思想基於增量法,將[0~j-1]排序後,將單個元素a[j]插入子陣列的合適位置,產生

新的排序子串行,直到子串行長度和原序列一樣。

演算法分析:歸併排序是基於分治的思想,將一組序列的排序分解成多個更小的序列排序,然後從最小的序列

(長度為1的序列)開始遞迴向上求解,求解過程是對左右分治的已排好序序列進行比較,填充上一級序列。

以下為含四個數的序列,排序流程圖:

排序演算法c語言實現如下:

有乙個小技巧需要注意,在合併流程裡面,在每乙個待合併序列的末端加入乙個無窮大的數,

這樣免去了陣列為空的判斷邏輯。

#include #include #include #include #define maxsize 4

#define endless 0xfffffff

/*合併流程*/

void merge(int *a,int l,int m,int r);

/*遞迴流程*/

void mergesort(int *a,int l,int r);

void printinfo(int *a,int n);

int main()

}sum = 0;

int rightsum = int_min;

int right = 0;

for(int i=mid+1;i<=high;i++)

}int r[3] = ;

return r;

}int *findmaxsubarray(int *a,int low,int high)

; return r;

}else

else if(right[2] >= left[2] && right[2] >= cross[2])

else

}}/*

非遞迴實現

*/int *findmaxsubarray1(int *a,int low,int high)

if(sum < 0)

}int r[3] = ;

return r;

}int main()

lgn-1層}}

}}0層(根)

f(a,0,n-1) =>r}

七種排序演算法的執行時間表

演算法 最壞執行時間

平均情況/期望執行時間

插入排序

o(n平方)

o(n平方)

歸併排序

o(nlgn)

o(nlgn)

堆排序o(nlgn)

快速排序

o(n平方)

o(nlgn)

計數排序

o(k+n)

o(k+n)

基數排序

o(d(k+n))

o(d(k+n))

桶排序 o(n平方)

o(n)

堆排序結合了歸併排序和插入排序的優點,在執行時間上和歸併相同,但是空間耗費和插入排序一樣,

具有原址性,即排序過程只需要常數個額外的臨時儲存空間。

1)(二叉)堆定義:堆近似被看成二叉數,樹上每乙個結點對應乙個陣列元素,除了最底層外,該樹

是個完全二叉樹。

對於結點i,它的父結點陣列下標為i/2,左兒子結點為i *2,右結點為i*2+1(對應0開始的陣列需要加1)。

最大堆:對於結點i,a[parent(i)] >=a[i]

最小堆:對於結點i,a[parent(i)] <=a[i]

2)最大堆排序過程分三個:

1.max-heapify

保持最大堆的最大性,對於每乙個根結點,它的左右孩子(如果有的話)的值都應比它要小,存在乙個

迴圈不變數i,任意ia[left(i)] && a[i] > a[right(i)] 。偽**過程如下:

max-heapify(h,i)

l = left(i)

r = right(i)

if i<=h.heap-size && h[i] < h[l]

largest = l

else largest = i

if i<=h.heap-size && h[largest] < h[r]

largest = r

if i != largest

max-heapify(a,largest)

2.build-heap

建立最大堆。建立最大堆的流程就是從最底層的第乙個元素(下標為n/2)開始,向上回朔根結點

迴圈呼叫max-heapify調整根結點和子結點的位置。其中存在乙個迴圈不變數i,對於i+1,i+2....n

都是乙個最大堆的根結點。偽**過程如下:

build-heap

a.heap-size = a.length

for i=n/2 down to 0

max-heapify(a,i)

3.heap-sort

堆排序根據最大堆根結點為最大值的性質,從堆最底層的最後乙個元素(下標n-1)開始,到第二個元素。

將該元素和堆頂(i=0)交換,然後由於根的改變,重新調整堆元素的位置。過程結束後,堆中元

素就按從小到大排序好。

heap-sort

for i=a.heap-size-1 downto 1

temp = a[i]

a[i] = a[0]

a[0] = temp

a.heap-size = a.heap-size-1

max-heapify(a,0)

完整**實現:

#include #include #define parent(i) (i>>1)-1

#define left(i) (i<<1)+1

#define right(i) (i<<1)+2

#define maxsize 7

struct heap

;void maxheapfy(struct heap *h,int i)

else

if(r <= h->heapsize-1 &&

h->heaparray[largest] < h->heaparray[r])

if(largest != i)

}void buildmaxheap(struct heap *h)

}void heapsort(struct heap *h)

}int main()

print_r(h->heaparray,maxsize);

printf("\n");

buildmaxheap(h);

heapsort(h);

print_r(h->heaparray,maxsize);

free(a);

free(h);

return 0;

}

oracle命令記錄本

b 本機連oracle b sqlplus as sysdba b 控制台cmd下匯出oralcle資料 b 表 exp username password sid ip file d table.dmp tables tablename1,tablename2 資料庫 exp username p...

常見單詞記錄本

access 訪問 adatation 介面卡 adequate 足夠的 alias 別名 alter 更改 alternate 交替 ancestor 祖先 anonymous 匿名的 architecture 架構 argument 引數 ascend 上公升 assignment 賦值 asy...

SC BP基礎記錄本

sc解碼 已知資訊位和資訊 凍結位元分布情況。首先求算接收通道的llr,實質上就是根據0 1的概率比較來判定。對於每一層向左迭代時,有llr的迭代公式。對於凍結位元,直接判定其為約定好的數值 對於資訊位元根據大於0與否,賦值為0 1。ssc 針對於rate 0節點 全零子樹 直接無需遍歷其子樹,也就...