//第八章——排序
一、插入類排序
//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...