算法代码:
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文件,几秒达成