当前位置:编程学习 > C/C++ >>

排序算法练习——代码汇总

之前写的插入排序,合并排序,堆排序,快速排序,计数排序算法,C++源码,发出来,大家共同学习。^_^

 

//排序算法汇总练习

#include "stdafx.h"
#include <iostream>

using namespace std;

	void InsertSort();//声明插入排序函数

	void MergeSort(int num[],int left,int right);//声明合并排序函数
	void Merge(int num[],int left,int right);//声明合并排序中要用到的合并函数

	void HeapSort();//声明堆排序函数
	void BuildHeap();//声明堆排序中用到的建立堆函数
	void HeapIfy(int i);//声明建立堆时要用到的保证堆性质的函数

	void QuickSort(int start,int end);//声明快速排序函数
	int Partition(int start,int end);//声明快速排序中用到的分割函数

	void CountingSort();//声明计数排序函数

	int num[5];
	int main()
	{
		for(int i=0;i<=4;i++)
		cin>>num[i];
		int length=sizeof(num)/sizeof(num[0]);
		CountingSort();
		//QuickSort(0,length-1);
		//HeapSort();
		//InsertSort();
		//MergeSort(num,0,4);
		for(int i=0;i<5;i++)
		cout<<num[i]<<endl;
		system("PAUSE");
		return 0;
	}

	//插入排序函数
	void InsertSort()
	{
		int n=sizeof(num)/sizeof(num[0]);//获取要排序数组的元素个数
		int j,key;
		for(int i=1;i<n;i++)
		{
			j=i-1;
			key=num[i];
			while(j>=0&&num[j]>key) 
			{
				num[j+1]=num[j];
				j--;
			}
			num[j+1]=key;
		}
	}

	//合并排序函数
	void MergeSort(int num[],int left,int right)
	{
		if(left<right)
		{
			int i=(left+right)/2;
			MergeSort(num,left,i);
			MergeSort(num,i+1,right);
			Merge(num,left,right);
		}
	}

	void Merge(int num[],int left,int right)
	{
		int i=left,j=(left+right)/2;
		int temp[10];
		for(int q=0;q<10;q++)
			temp[q]=0;
		int m=left,n=j+1;
		while(m<=j&&n<=right)
		{
			if(num[m]<num[n])
				temp[i++]=num[m++];
			else if(num[m]>=num[n])
				temp[i++]=num[n++];
		}
		if(m>j)
		{
			while(n<=right)
				temp[i++]=num[n++];
		}
		else
		{
			while(m<=j)
				temp[i++]=num[m++];
		}
		for(i=left;i<=right;i++)
		{
			num[i]=temp[i];
		}
	}

	//堆排序函数,注意堆排序时考虑树节点排序是从1开始,数组下标从0开始,所以相应减1
	void HeapIfy(int i,int length)
	{
		int l=2*i;
		int r=2*i+1;
		int largest,temp;
		if(num[l-1]>num[i-1]&&l<=length)
			largest=l;
		else
			largest=i;
		if(num[r-1]>num[largest-1]&&r<=length)
			largest=r;
		if(largest!=i)
		{
			temp=num[i-1];
			num[i-1]=num[largest-1];
			num[largest-1]=temp;
			HeapIfy(largest,length);
		}
	}
	void BuildHeap()
	{
		int length=sizeof(num)/sizeof(num[0]);
		for(int i=length/2;i>=1;i--)
			HeapIfy(i,length);
	}
	void HeapSort()
	{
		int length=sizeof(num)/sizeof(num[0]);
		int temp;
		BuildHeap();
		for(int i=length;i>=1;i--)
		{
			temp=num[i-1];
			num[i-1]=num[0];
			num[0]=temp;
			HeapIfy(1,i-1);
		}
	}

	//快速排序算法函数
	int Partition(int start,int end)
	{
		int x=num[start];
		int i=start;
		int j=end;
		int temp;
		while(num[i]<x){
			i++;
		}
		while(num[j]>x){
			j--;
		}
		if(i<j)
		{
			temp=num[j];
			num[j]=num[i];
			num[i]=temp;
		}
		else
		{
			return j;
		}
	}

	void QuickSort(int start,int end)
	{
		if(start<end)
		{
			int m=Partition(start,end);
			QuickSort(start,m);
			QuickSort(m+1,end);
		}
	}

	//计数排序,适用于被排序元素大小在1~k之间的排序
	void CountingSort( )
	{
		int n=sizeof(num)/sizeof(num[0]);
		int numTemp[5]; //临时存储排序结果
		int temp[6];//数组元素个数为排序元素中的最大值+1
		for(int i=0;i<6;i++)
		{
			temp[i]=0;
		}
		for(int j=0;j<n;j++)
		{
			temp[num[j]]=temp[num[j]]+1;
		}
		for(int k=1;k<6;k++)
		{
			temp[k]=temp[k]+temp[k-1];
		}
		for(int l=n-1;l>=0;l--)
		{
			numTemp[temp[num[l]]-1]=num[l];
			temp[num[l]]--;
		}
		for(int m=0;m<n;m++)
			num[m]=numTemp[m];
	}

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,