本人近日要写一个排序算法,需要考虑算法的性能。原来计划使用快速排序算法,在网上找到的快速算法都不易理解,于是就写了如下算法。算法的原理如下:
1.判断数组元素数量的奇偶性,用于判断数组的中间分隔;
2.定义两个变量用来存放临时最大值和最小值的下标,定义两个变量用当前区域最大值和最小值的下标;
3.在主循环体中找到最大值和最小值,分别与放置到最后或最前交换,下一次循环前去除头和尾,计算剩余值的最大值和最小值,与当前最后或最前交换...,直到计算到数组的中间为止。算法时间复杂度为=n/2 * (n-1) *(n-3)* (n-5)*.....*3或2 。有意见问题或是问题请联系我tonmy1999@126.com
#include "stdafx.h"
#include <iostream.h>
void Sort(int* pSort,int iLen);
void Swap(int* Num1,int* Num2);
void PrintInt(int* pSort,int iLen);
int a[10]={9,8,5,6,4,7,2,0,3,1};
int main(int argc, char* argv[])
{
cout<< "Old Array is:";
PrintInt(a,10);
Sort(a,10);
cout<< "New Array is:";
PrintInt(a,10);
return 0;
}
void Sort(int* pSort,int iLen)
{
//1.判断数组元素数量的奇偶性,用于判断数组的中间分隔;
int iSpace=0;
if (1 == (iLen%2))
iSpace=2;
else
iSpace=1;
int iMax,iMin,iCurMax,iCurMin;
iMax=iLen-1;
iMin=0;
while((iMax-iMin) >= iSpace)
{
iCurMax=iMax; //临时最大初始化
iCurMin=iMin; //临时最小初始化
if(pSort[iMin] > pSort[iMax]) //初始比较
Swap(&pSort[iMin],&pSort[iMax]);
for(int i=iMin;i< iMax;i++)
{
if(pSort[i+1] < pSort[iMin]) //得到当前最小值的下标
iCurMin=i+1;
if(pSort[i] > pSort[iMax]) //得到当前最大值的下标
iCurMax=i;
}
Swap(&pSort[iMin],&pSort[iCurMin]); //交换当前的最小值
Swap(&pSort[iMax],&pSort[iCurMax]); //交换当前的最大值
iMin++;
iMax--;
}
}
void Swap(int* Num1,int* Num2)
{
int iTemp=*Num1;
*Num1=*Num2;
*Num2=iTemp;
}
void PrintInt(int* pSort,int iLen)
{
cout << pSort[0];
for(int i=1;i<iLen;i++)
{
cout << "--";
cout << pSort[i] ;
}
cout << endl;
}