算法代码:
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 } 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)
- excel合并单元格快捷键是什么
- 我来教你Excel把多个单元格内容合并到一个单元格的操作教程 我来教你跳舞
- 小编教你闪电PDF转换成WORD转换器合并或分割PDF文件的详细操作教程
- 小编教你Excel快速合并两列数据/文本的操作教程 小编教你怎么选:羽毛球拍3U和4U的区别
- 教你excel表格里直接相加来求和的操作方法 Excel表合并
- 笔记本电脑分盘教程 电脑分盘怎么合并
- 小编分享迅捷CAD编辑器把CAD里多个图形合并成块的相关流程 迅捷影视分享码
- 西樵实验小学升学率 佛山市公办小学排名?
- 教你Excel 2019自动排序编号的详细步骤教程
- 金山pdf阅读器如何合并pdf文件,几秒达成
