//常见的排序算法
//创建日期:2011年4月22
#include <iostream>
using namespace std;
#define MAX_OF_ARRAY 10 //待排序的数组最大数值
int iTemp = 0;
int iTimes = 0;
//交换数据
void Change(int *a, int *b)
{
iTemp = *a;
*a = *b;
*b = iTemp;
iTimes++;
}
//打印数据
void Print(int *arrays)
{
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
cout << *arrays << " ";
arrays++;
}
cout << endl;
cout << "总共交换次数:" << iTimes << endl;
}
/******************************************/
//插入法排序InsertSort(int *arrays)
/******************************************/
void InsertSort(int *arrays)
{
int itemp;
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
itemp = i;
for(int j = i - 1; arrays[itemp] > arrays[j] && j >= 0; itemp-- && j--)
Change(&arrays[itemp], &arrays[j]);
}
}
/******************************************/
//选择排序SelectSort(int *arrays)
/******************************************/
void SelectSort(int *arrays)
{
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
int IMAX = i;
for(int j = i + 1; j < MAX_OF_ARRAY; j++)
{
if(arrays[j] > arrays[IMAX])
IMAX = j;
}
if(IMAX != i)
{
Change(&arrays[IMAX], &arrays[i]);
}
}
}
/******************************************/
//冒泡排序法BubbleSort(int *arrays)
/******************************************/
void BubbleSort(int *arrays)
{
int BUBBLE = 0;
while(BUBBLE == 0)
{
BUBBLE = 1;
for(int i = 0; i < MAX_OF_ARRAY - 1; i++)
{
if(arrays[i] < arrays[i + 1])
{
Change(&arrays[i], &arrays[i + 1]);
BUBBLE = 0;
}
}
}
}
/******************************************/
//快速排序法QuickSort(int *arrays)
/******************************************/
void QuickSort(int *arrays, int arraylen)
{
if(arraylen > 1)
{
int num = 0, i = 0, j = arraylen - 1, itemp = 0;
while(i != j)
{
i = 0, j = arraylen - 1, itemp = 0;
//from back to front to search the number which is greater than the key number,then change;
for(j; j > num; j--)
{
if(arrays[num] < arrays[j])
{
Change(&arrays[num], &arrays[j]);
num = j;
break;
}
}
//from back to front to search the number which is less than the key number, then change;
for(i; i < num; i++)
{
if(arrays[num] > arrays[i])
{
Change(&arrays[num], &arrays[i]);
num = i;
break;
}
}
}
QuickSort(arrays, num);
QuickSort(arrays + num + 1, arraylen - num - 1);
}
}
/******************************************/
//堆排序法HeapSort(int *arrays)
/******************************************/
void HeapKeepMax(int *arrays, int iNode, int Length)
{
int ChildNode = 0;
//结点下移,直至大于总长度
for(int i = iNode; 2 * iNode + 2 <= Length; iNode = ChildNode)
{
ChildNode = iNode * 2 + 1;
//保持ChildNode指向子结点中的较大者
if((ChildNode + 1 < Length) && arrays[ChildNode] < arrays[ChildNode + 1])
ChildNode++;
//如果结点比子结点小,交换
if(arrays[iNode] < arrays[ChildNode])
Change(&arrays[iNode], &arrays[ChildNode]);
else
break;
}
}
void HeapAdjust(int *arrays, int Length)
{
for(int i = (Length - 2) / 2; i >= 0; i--)
HeapKeepMax(arrays, i, Length);
Change(&arrays[0], &arrays[Length - 1]);
}
void HeapSort(int *arrays, int Length)
{
for(int i = Length; i > 1; i--)
HeapAdjust(arrays, i);
}
/******************************************/
//归并排序法MergeSort(int *arrays)
/******************************************/
void main()
{
int arrays[MAX_OF_ARRAY] = {3, 25, 35, 1, 2, 64, 33, 9, 23, 7};
// InsertSort(arrays);
// SelectSort(arrays);
// BubbleSort(arrays);
// QuickSort(arrays, MAX_OF_ARRAY);
HeapSort(arrays, MAX_OF_ARRAY);
Print(arrays);
}
2019-07-17 22:49:45