第八章 排序演算法總結

2021-09-29 03:54:19 字數 1856 閱讀 6665

//第八章——排序

一、插入類排序

//1、直接插入排序

void insertsort(int r,int n)

t->next=null;

}//排序函式

void sort(lnode *h)

p1=p->next;

p->next=pre->next;

pre->next=p;

p=p1;

} } }

//2、折半插入排序

//折半插入排序:

void insertsorthalf(int a,int n)

for(j=i-1;j>=high+1;--j)

a[j+1]=a[j];

a[high+1]=a[0];

}}//3、希爾排序——縮小增量排序

二、交換類排序

//1、起泡排序

void bubblesort(int r,int n)

if(flag==false)

return; }}

//2、雙向起泡——先從左往右冒最大的,再從右往左冒最小的

void sort(int r,int n)

} --high;

for(int j=high;j>low;--j) //從右往左冒最小的

if(min!=i)

swap(a[i],a[min]); }}

//2、堆排序

#include //堆排序

//因為堆是一棵完全二叉樹,固可用陣列來表示

const int maxn=100;

int heap[maxn],n=10;//heap 為堆,n為元素個數

//堆由上向下調整:將每個結點v與其孩子比較,若有比其大的,則交換他們的位置

//直到沒有比他大的或沒有孩子結點

//對heap陣列在[low,high]範圍下進行向下調整

//其中low為欲調整結點的陣列下標,high一般為堆的陣列的最後乙個元素的陣列下標

void downadjust(int low,int high)

//如果孩子中最大的權值比欲調整結點i大

if(heap[j]>heap[i])

else

break;//孩子的權值均比欲調整結點小,調整結束

}//建堆:由於完全二叉樹的葉子結點為n/2向上取整,因此陣列下標在[1,n/2]範圍內的結點都是非葉結點。

//於是可以從n/2的位置倒著列舉結點,因為每調整完乙個結點,權值最大的結點就會在根結點的位置,這樣可以保證每個結點都是以其為根的子樹中權值最大的結點

void createheap()

//如果要刪除最大元素(堆頂)並讓其保持堆的結構,只需讓最後乙個元素覆蓋堆頂元素,然後對根結點調整即可

//刪除堆頂元素

void deletetop()

//往堆中新增元素,將元素新增至陣列最後,然後向上調整

void upadjust(int low,int high)

else

break;

} }//新增元素x

void insert(int x)

//堆排序

void heapsort()

}四、二路歸併排序——分組兩兩歸併

void merge(int a,int low,int mid,int high)

while(i<=mid)

a[k++]=b[i++]; //若第一段未檢測完,直接複製

while(j<=high)

a[k++]=b[j++];

}void mergesort(int a,int low,int high)

}五、基數排序

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章 排序技術

排序共分為5大類,插入 交換 選擇 歸併 分配。他們的穩定性及平均時間效能如下圖 這是幾種排序演算法的簡單思想 1.直接插入排序 每一趟將乙個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上,直到所有待排序記錄全部插入為止。2.希爾排序 先取乙個小於n的整數d1作為第乙個增量,把...

第八章 排序技術

一 歸併排序 將原序列分成若干個子串行,然後重組 include.h using namespace std const int n 9 int a n int temp n void msortroot int f,int e,int mid while i 排序後有遺漏需再次填入 while j...