选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
void selectionSort(int data[], int count)
{
int i, j, min, temp;
for (i = 0; i < count - 1; i++) {
/* find the minimum */
min = i;
for (j = i+1; j < count; j++)
if (data[j] < data[min])
min = j;
/* swap data[i] and data[min] */
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
}
堆积排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法。
堆积树是一个近似完全二叉树的结构,
并同时满足堆积属性:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆积树节点的访问
通常堆积树(heap)是通过一维数组来实现的。在起始数组为 0 的情形中:
- 堆积树的根节点(即堆积树的最大值)存放在数组位置 1 的地方;
注意:不使用位置 0,否则左子树永远为 0[2]
- 父节点i的左子节点在位置 (2*i);
- 父节点i的右子节点在位置 (2*i+1);
- 子节点i的父节点在位置 floor(i/2);
堆积树的操作
在堆积树的数据结构中,堆积树中的最大值总是位于根节点。堆积树中定义以下几种操作:
- 最大堆积调整(Max_Heapify):将堆积树的末端子结点作调整,使得子结点永远小于父结点
- 创建最大堆积(Build_Max_Heap):将堆积树所有数据重新排序
- 堆积排序(HeapSort):移除位在第一个数据的根结点,并做最大堆积调整的递归运算
#include <iostream>
using namespace std;
//最大堆积调整(Max_Heapify):将堆积树的末端子结点作调整,使得子结点永远小于父结点
void max_heap(int array[],int i,int length)
{
int left=2*i;
int right=2*i+1;
int largest;
int temp;
if(left<length && array[left]>array[i])
largest = left;
else largest = i;
if(right<length && array[right]>array[largest])
largest = right;
if(largest!=i)
{
temp = array[i];
array[i]=array[largest];
array[largest]=temp;
max_heap(array,largest,length);
}
}
//堆积排序(HeapSort):移除位在第一个数据的根结点,并做最大堆积调整的递归运算
void heapSort(int array[],int length)
{
int i,temp;
for(i=length/2;i>=0;i--)
max_heap(array,i,length);
for(i=length-1;i>0;i--)
{
temp = array[0]; //将最大值array[0]调到数组末尾
array[0]=array[i];
array[i] = temp;
length--;
max_heap(array,0,length); //每次把最大值调到array[0]
}
}
int main()
{
//int array[]={15,9,8,1,4,11,7,2,13,16,5,3,6,2,10,14};
int array[]={13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10,35,54,90,58};
int i;
int length=sizeof(array)/sizeof(int); //在这里 sizeof(array)=80
heapSort(array,length);
for(i=0;i<length;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
return 0;
}