多种排序算法的C++实现(转)

#include <iostream>
#include <time.h>
using namespace std;
const long datasize = 1 << 15;
int arr[datasize]{};
clock_t s, e;
void print(int a[], long size);

void BubbleSort(int a[], long size);
void Merge(int arr[], long lo, long mi, long hi);
void MergeSort(int arr[], long lo, long hi);
void InsertSort(int arr[], long size);
void SelectSort(int arr[], long size);
void RadixSort(int arr[], long size);
int Maxbit(int arr[], long size);
void QuickSort(int arr[], long lo, long hi);

int main(int argc, const char * argv[]) {
#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	BubbleSort(arr, datasize);
	e = clock();
	//print(arr,datasize);
	cout << endl << datasize << " Num-Sortint " << "BubbleSort Using: " << e - s << " us" << endl;
#endif

#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	InsertSort(arr, datasize);
	e = clock();
	//print(arr,datasize);
	cout << endl << datasize << " Num-Sortint " << "InsertSort Using: " << e - s << " us" << endl;
#endif

#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	MergeSort(arr, 0, datasize);
	e = clock();
	//print(arr,datasize);
	cout << endl << datasize << " Num-Sortint " << "MergeSort Using: " << e - s << " us" << endl;
#endif

#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	SelectSort(arr, datasize);
	e = clock();
	//print(arr,datasize);
	cout << endl << datasize << " Num-Sortint " << "SelectSort Using: " << e - s << " us" << endl;
#endif

#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	QuickSort(arr, 0, datasize);
	e = clock();
	//print(arr,datasize);
	cout << endl << datasize << " Num-Sortint " << "QuickSort Using: " << e - s << " us" << endl;
#endif


#if 1
	for (long i = 0; i<datasize; i++)
	{
		arr[i] = rand();
	}
	s = clock();
	RadixSort(arr, datasize);
	e = clock();
	//print(arr,datasize);
	//cout<<Maxbit(arr, datasize);
	cout << endl << datasize << " Num-Sortint " << "RadixSort Using: " << e - s << " us" << endl;
#endif


}

void BubbleSort(int a[], long size)
{
	for (long i = 0; i<size; i++)
	{
		bool flag = true;
		for (long j = 0; j<size - i - 1; j++)
		{
			if (a[j]>a[j + 1])
			{
				swap(a[j + 1], a[j]);
				flag = false;
			}
		}
		if (true == flag)return;
	}
}

void MergeSort(int arr[], long lo, long hi)
{
	if (hi - lo<2)return;
	long mi = (lo + hi) / 2;
	MergeSort(arr, lo, mi);
	MergeSort(arr, mi, hi);
	Merge(arr, lo, mi, hi);
}
void Merge(int arr[], long lo, long mi, long hi)
{
	long ml = mi - lo;
	int *b = new int[ml];
	for (long i = 0; i<ml; i++)b[i] = arr[lo + i];
	//print(b, ml);
	long x = 0, y = mi;
	for (long i = lo; i<hi;)
	{
		if ((b[x] <= arr[y] && x<ml) || y >= hi)
		{
			arr[i++] = b[x++];
		}
		if ((arr[y]<b[x] && y<hi) || x >= ml)
		{
			arr[i++] = arr[y++];
		}
	}
	delete[]b;
}
void InsertSort(int arr[], long size)
{
	for (int i = 1; i<size; i++)
	{
		int temp = arr[i];
		int j = i - 1;
		while (j >= 0)
		{
			if (arr[j]>temp)arr[j + 1] = arr[j];
			else { j--; break; }
			j--;
		}
		arr[j + 1] = temp;
	}
}

void SelectSort(int arr[], long size)
{
	for (long i = size - 1; i >= 0; i--)
	{
		int maxnum = arr[i];
		long rank = i;
		for (long j = 0; j<i; j++)
		{
			if (arr[j] >= maxnum)
			{
				maxnum = arr[j];
				rank = j;
			}
		}
		swap(arr[rank], arr[i]);
	}
}
void QuickSort(int arr[], long lo, long hi)
{
	if (hi - lo<2)return;
	long rank = rand() % (hi - lo) + lo, ranklo = lo, rankhi = hi;
	swap(arr[ranklo], arr[rank]);
	int key = arr[lo];
	hi--;
	while (lo<hi)
	{
		while (lo<hi&&key <= arr[hi])hi--;
		arr[lo] = arr[hi];
		while (lo<hi&&arr[lo] <= key)lo++;
		arr[hi] = arr[lo];
	}
	arr[lo] = key;
	QuickSort(arr, ranklo, lo);
	QuickSort(arr, lo + 1, rankhi);
}
void RadixSort(int arr[], long size)
{
	int bit = Maxbit(arr, size);
	int radix = 1;
	int *tmp = new int[size];
	int *countn = new int[10];
	while (bit--)
	{
		for (int i = 0; i<10; i++)
		{
			countn[i] = 0;
		}
		for (int i = 0; i<size; i++)
		{
			int k = (arr[i] / radix) % 10;
			countn[k]++;
		}
		for (int i = 1; i<10; i++)
		{
			countn[i] += countn[i - 1];
		}
		for (int i = 0; i<size; i++)
		{
			int k = (arr[i] / radix) % 10;
			tmp[countn[k] - 1] = arr[i];
			countn[k]--;
		}
		for (int i = 0; i<size; i++)
		{
			arr[i] = tmp[i];
		}
		radix *= 10;
	}
	delete[]tmp;
	tmp = NULL;
	delete[]countn;
	countn = NULL;
}
int Maxbit(int arr[], long size)
{
	int maxnum = 0;
	for (int i = 0; i<size; i++)
	{
		if (arr[i]>maxnum)maxnum = arr[i];
	}
	//cout<<maxnum<<endl;
	int bit = 0;
	while (maxnum)
	{
		maxnum /= 10;
		bit++;
	}
	return bit;
}
void print(int a[], long size)
{
	for (long i = 0; i<size; i++)
	{
		cout << a[i] << " \t";
		if (0 == i + 1 % 4)cout << endl;
	}
}

 

转载于:https://my.oschina.net/u/3776947/blog/1630675

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值