#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; }
运行界面如下: