您的位置:首页 > 其它

简单选择排序和堆排序

2012-08-28 20:33 176 查看
#include "stdafx.h"
#include <iostream>

using namespace std;

#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE + 1];
int length;
}SqList;

typedef SqList HeapType;

//***********************************选择排序*************************************begin
//查找最小值
int SelectMinKey(const SqList& L, int start)
{
int minValue = L.r[start];
int index = start;
for (int i = start; i <= L.length; i++)
{
if (minValue > L.r[i])
{
minValue = L.r[i];
index = i;
}
}
return index;
}

//简单选择排序
void SelectSort(SqList &L)
{
for (int i = 1; i <= L.length; i++)
{
int j = SelectMinKey(L, i);
if (i != j)
{
int tmp = L.r[i];
L.r[i] = L.r[j];
L.r[j] = tmp;
}
}
}

void SqlistPrint(SqList &L)
{
for (int i = 1; i <= L.length; i++)
{
cout<<L.r[i]<<"  ";
}
cout<<endl;
}

//***********************************选择排序*************************************end

//***********************************堆排序*************************************begin
//堆调整
void HeadAdjust(HeapType &H,int s,int m)
{
int rc = H.r[s];
for (int j = 2 * s; j <= m; j *= 2)
{
if (j < m && H.r[j] < H.r[j + 1])
{
++j;
}
if (rc > H.r[j])
{
break;
}
H.r[s] = H.r[j];
s = j;
}
H.r[s] = rc;
}

//堆排序
void HeadSort(HeapType &H)
{
for (int i = H.length / 2; i > 0; --i)
{
HeadAdjust(H, i, H.length);
}
for (int i = H.length; i > 1; --i)
{
int tmp = H.r[1];
H.r[1] = H.r[i];
H.r[i] = tmp;
HeadAdjust(H, 1, i - 1);
}
}

void HeadPrint(HeapType &H)
{
for (int i = 1; i <= H.length; i++)
{
cout<<H.r[i]<<"  ";
}
cout<<endl;
}

//***********************************堆排序*************************************end

int _tmain(int argc, _TCHAR* argv[])
{
int arr[8] = {49, 38, 65, 97, 76, 13, 27, 49};
SqList L;
HeapType H;
L.length = H.length = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
L.r[i + 1] = arr[i];
H.r[i + 1] = arr[i];
}
cout<<"*************************简单排序**************************"<<endl;
cout<<"before: ";
SqlistPrint(L);
SelectSort(L);
cout<<"after:  ";
SqlistPrint(L);

cout<<endl<<"**************************堆排序***************************"<<endl;
cout<<"before: ";
HeadPrint(H);
HeadSort(H);
cout<<"after:  ";
HeadPrint(H);

return 0;
}


运行界面如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐