首页 > 编程语言 >选择排序——简单选择排序和堆排序,C++代码实现

选择排序——简单选择排序和堆排序,C++代码实现

时间:2023-08-27 11:36:46浏览次数:43  
标签:结点 int 堆排序 C++ high length low SqList 排序


#include <iostream>
using namespace std;
typedef struct
{
	int r[100+1];
	int length;
}SqList;
//简单选择排序
void SimpleSlectSort(SqList &L)
{
	int min,i,j;
	for(i=1;i<L.length;i++)
	{
		min=i;
		for(j=i+1;j<=L.length;j++)
			if(L.r[j]<L.r[min])
				min=j;//找到无序区中最小的元素
		if(i!=min)
		{//在i所指的元素不是最小记录的情况下
			L.r[0]=L.r[i];
			L.r[i]=L.r[min];
			L.r[min]=L.r[0];
		}
	}
}
//堆排序
void HeapAdjust(SqList &L,int low,int high)
{//该函数的作用是以low为顶点,以high为无序区的最后一个元素,建堆
	int j;
	L.r[0]=L.r[low];//把low中的元素存在0号单元中,以后就和0号单元作比较
	for(j=2*low;j<=high;j*=2)
	{
		if(j<high && L.r[j]<L.r[j+1])
			j++;//找到两个孩子中的较大者
		if(L.r[0]>=L.r[j])
			break;/*因为从最后一个分支结点开始建堆的,所以当前结点之后的全部结点
				  已全部是堆,如果当前结点比左右孩子都大,则该结点已是一个堆,不
				  用考虑后面的结点了,故应直接跳出循环。*/
		else
		{
			L.r[low]=L.r[j];
			low=j;
		}
		L.r[low]=L.r[0];
	}
}
void HeapSort(SqList &L)
{
	int i,high;
	for(i=L.length/2;i>0;i--)
		HeapAdjust(L,i,L.length);//初始建堆
	for(high=L.length;high>1;high--)
	{
		L.r[0]=L.r[1];
		L.r[1]=L.r[high];
		L.r[high]=L.r[0];//堆顶和最后一个元素互换
		HeapAdjust(L,1,high-1);//从堆顶再进行调整
	}
}
void main()
{
	//freopen("in.txt","r",stdin);
	SqList L;
	int i;
	cin>>L.length;
	for(i=1;i<=L.length;i++)
		cin>>L.r[i];
	SimpleSlectSort(L);
	for(i=1;i<=L.length;i++)
		cout<<L.r[i]<<" ";
	cout<<endl;
	HeapSort(L);
	for(i=1;i<=L.length;i++)
		cout<<L.r[i]<<" ";
}

 

标签:结点,int,堆排序,C++,high,length,low,SqList,排序
From: https://blog.51cto.com/u_5173797/7251982

相关文章

  • 循环队列的定义、入队、出队等操作 C++代码实现
    #include<iostream>usingnamespacestd;/*循环队列的类型定义*/constintQueue_Size=100;typedefstructcirclQueue{char*elem;intrear;intfront;intqueueSize;}circlQueue;/*初始化*/voidinitQueue_C(circlQueue&......
  • 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
     #include<iostream>usingnamespacestd;/*顺序栈的定义*/#defineStack_Size100typedefstructsqStack{char*elem;inttop;intstackSize;//栈数组长度}sqStack;/*顺序栈的初始化*/voidinitStack_Sq(sqStack&S){S.elem=ne......
  • 用线性表实现的通讯录管理 C++代码
    /****************************************//*主控菜单处理测试程序main2.c************//***************************************/#include<iostream>#include<string>usingnamespacestd;#defineLIST_INIT_SIZE100#defineLISTINCREMENT10intOK=......
  • 用单链表实现一元多项式相加 C++代码
     #include<iostream>usingnamespacestd;/*结点的定义*/typedefstructLNode{floatcoef;intexp;structLNode*next;}LNode;typedefLNode*Polynomial;/*多项式的初始化*/voidinitDuoX(Polynomial&Px){Px=newLNode;......
  • 双链表的定义、初始化、插入、删除,C++代码实现的算法
    #include<iostream>usingnamespacestd;/*双向链表类型定义*/typedefstructduNode{chardata;structduNode*prior;structduNode*next;}duNode;typedefduNode*duLinklist;//指针类型,故访问它的成员用“->”。/*初始化双向链表*/voidinitLinkl......
  • 链队列的实现,C++代码实现
    /*链队列的实现*/#include<iostream>usingnamespacestd;/*链队列类型定义*/typedefstructQNode{structQNode*next;chardata;}QNode,*queuePtr;//结点的定义typedefstructlinkQueue{queuePtrrear;queuePtrfront;}linkQueue;//队列的定......
  • 基于QT和C++实现的停车场管理系统
    基于QT和C++实现的停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只能在门外的狭长便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入。每辆停放在......
  • 「算法与数据结构」梳理6大排序算法 为了offer!
    6种排序如下......
  • LeetCode —— 排序
    148. 排序链表一般都用归并排序,因为是单向链表,其它排序算法根据下标找元素,向前遍历等都比较困难主函数流程是:如果head==null||head.next==nullreturnhead。因为 head.next==null即只有一个元素时,不用再划分了,而且一个元素本身也是有序的,所以返回就返回这一个元素......
  • 力扣-2. 两数相加(C++题解)
    题目链接:https://leetcode.cn/problems/add-two-numbers/description/给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之......