合并排序实验报告总结 合并排序c语言算法代码( 三 )

算法代码:
void print(int a[], int n ,int i){ cout<<"第"< for(int j= 0; j<8; j){ cout< } cout<}/** * 数组的最小值 * * @return int 数组的键值 */int SelectMinKey(int a[], int n, int i){ int k = i; for(int j=i 1 ;j< n;j) { if(a[k] > a[j]) k = j; } return k;}
/** * 选择排序 * */void selectSort(int a[], int n){ int key, tmp; for(int i = 0; i< n;i) { key = SelectMinKey(a, n,i); //选择最小的元素 if(key != i){ tmp = a[i]; a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换 } print(a, n , i); }}int main{ int a[8] = {3,1,5,7,2,4,9,6}; cout<<"初始值:"; for(int j= 0; j<8; j){ cout< } cout< selectSort(a, 8); print(a,8,8);}四、堆排序(Heap Sort)
算法思想:
堆的概念
堆:本质是一种数组对象 。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点 。对此,又分为大顶堆和小顶堆:
大顶堆要求节点的元素都要大于其孩子 。
小顶堆要求节点元素都小于其左右孩子 。
两者对左右孩子的大小关系不做任何要求 。
利用堆排序,就是基于大顶堆或者小顶堆的一种排序方法 。下面,我们通过大顶堆来实现 。
基本思想:堆排序可以按照以下步骤来完成:
1.首先将序列构建称为大顶堆;(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值)
2. 取出当前大顶堆的根节点,将其与序列末尾元素进行交换;(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质)
3. 对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质;
4. 重复2.3步骤,直至堆中只有1个元素为止
下面是基于大顶堆的堆排序算法代码:
void print(int a[], int n){ for(int j= 0; j cout< } cout<}/** * 已知H[s…m]除了H[s] 外均满足堆的定义 * 调整H[s],使其成为大顶堆.即将对第s个结点为根的子树筛选, * * @param H是待调整的堆数组 * @param s是待调整的数组元素的位置 * @param length是数组的长度 */void HeapAdjust(int H[],int s, int length){ int tmp = H[s]; int child = 2*s 1; //左孩子结点的位置 。(i 1 为当前调整结点的右孩子结点的位置) while (child < length) { if(child 1 child ; } if(H[s] H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点 s = child; // 重新设置s ,即待调整的下一个结点的位置 child = 2*s 1; } else { // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出 break; } H[s] = tmp; // 当前待调整的结点放到比其大的孩子结点位置上 } print(H,length);}
/** * 初始堆进行调整 * 将H[0..length-1]建成堆 * 调整完之后第一个元素是序列的最小的元素 */void BuildingHeap(int H[], int length)

推荐阅读