插入法排序、选择排序、冒泡法、快速排序、堆排序的C实现

// 排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdio.h"
#include "math.h"
#include "tchar.h"
#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 PrintArray(int *arrays)
{
	for(int i = 0;i < MAX_OF_ARRAY;i++)
	{
		_tprintf(_T("%d  "),*arrays);
		arrays++;
	}
	_tprintf(_T("/ntimes: %d/n"),iTimes);
}

////////////////////////////////////////////////////////
//插入法排序
void InsetSort(int *arrays)
{
	int itemp = 0;
	for (int i = 1;i < MAX_OF_ARRAY;i++)
	{
		itemp = i;
		//从第i个元素向前查找比自己小的,
		//找到就交换元素和下标,然后接着查找
		for (int j = i-1;arrays[itemp] > arrays[j]
								&& j >= 0;j--,itemp--)
		{
			Change(&arrays[itemp],&arrays[j]);
		}
	}
}

////////////////////////////////////////////////////////
//选择排序
void SelectionSort(int *IntArray)
{
	
	for (int i = 0;i < MAX_OF_ARRAY;i++)
	{
		int iMin = i;
		for (int j = i+1;j < MAX_OF_ARRAY;j++)
		{
			if (IntArray[j] < IntArray[iMin])
			{
				iMin = j;//找到最小的数
			}
		}
		if (i != iMin)
		{
			Change(&IntArray[iMin],&IntArray[i]);
		}
		PrintArray(IntArray);
	}
}

////////////////////////////////////////////////////////
//冒泡法
void BubbleSort(int *IntArray)
{
	bool bIsNeedRoop = false;
	for(int i = 0;i < MAX_OF_ARRAY;i++)
	{
		bIsNeedRoop = false;
		for(int j = 0;j < MAX_OF_ARRAY-i-1;j++)
		{
			if(IntArray[j] > IntArray[j+1])
			{
				Change(&IntArray[j],&IntArray[j+1]);
				bIsNeedRoop = true;
			}
		}
		//如果查询一次后发现不需交换,说明已经排完序
		//可以直接退出
		if(!bIsNeedRoop) break;
	}
}
////////////////////////////////////////////////////////
//快速排序
void QuickSort(int *IntArray,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;
			//从后往前查找比关键数大的数,交换
			for (j;j > num;j--)
			{
				if (IntArray[num] < IntArray[j])
				{
					Change(&IntArray[num],&IntArray[j]);
					num = j;
					break;
				}
			}
			//从前往后查找比关键数小的数,交换
			for(i;i < num;i++)
			{
				if(IntArray[num] > IntArray[i])
				{
					Change(&IntArray[num],&IntArray[i]);
					num = i;
					break;
				}
			}
		}
		//数组分两部分(比关键数大的部分和比关键数小的部分)
		QuickSort(IntArray,num);
		QuickSort(IntArray+num+1,ArrayLen-num-1);
	}
}


//////////////////////////////////////////////////////////////////////////
//堆排序
//在单个结点上保持符合堆的要求
void HeapKeepMax(int *IntArray,int iNode,int iLength)
{
	int iChildNode = 0;
	//结点不断下移,直到大于总长度
	for(int i = iNode;2*iNode+2 <= iLength;iNode = iChildNode)
	{
		iChildNode = iNode*2+1;
		//保持iChildNode指向子结点中较大者。
		if ((iChildNode+1 < iLength) && IntArray[iChildNode] < IntArray[iChildNode+1] )
		{
			iChildNode++;
		}
		//如果结点比子结点小,没交换
		if (IntArray[iNode] < IntArray[iChildNode])
		{
			Change(&IntArray[iNode],&IntArray[iChildNode]);
		}else break; //如果结点比子结点大,退出
	}
}

//IntArray[0...iLength]做堆调整,iLength递减
void HeapAdjust(int *IntArray,int iLength)
{
	for (int i = (iLength-2)/2;i >= 0 ;i--)
	{
		HeapKeepMax(IntArray,i,iLength);
	}
	
	Change(&IntArray[0],&IntArray[iLength-1]);
}

//堆排序
void HeapSort(int *IntArray,int iLength)
{
	for (int i = iLength;i > 1;i--)
	{
		HeapAdjust(IntArray,i);
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	int  IntArray[MAX_OF_ARRAY] = {3,25,34,1,2,64,33,9,23,7};
	//int  IntArray[MAX_OF_ARRAY] = {0,1,2,3,4,5,6,7,8,9};
	//int  IntArray[MAX_OF_ARRAY] = {9,8,7,6,5,4,3,2,1,0};
	//int  IntArray[MAX_OF_ARRAY] = {9,8,7,6,5,0,1,2,3,4};
	//InsetSort(IntArray);
	//BubbleSort(IntArray);
	//QuickSort(IntArray,MAX_OF_ARRAY);
	//SelectionSort(IntArray);
	HeapSort(IntArray,10);
	PrintArray(IntArray);
	return 0;
}

你可能感兴趣的:(c,Arrays,math.h)