各种排序

#define  _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <time.h>
#define  N 1000000
using namespace std;

inline void swap(int *a, int *b)
{
	if (a != b)
	{
		*a = *a^*b;
		*b = *a^*b;
		*a = *a^*b;
	}
}
void isOrder(int a[], int n)
{
	int i = 1;
	for (; i < n; ++i)
	{
		if (a[i - 1]>a[i])
		{
			printf("错误\n");
			return;
		}
	}
	printf("升序\n");
}

//冒泡排序
void buble(int a[],int n)
{
	int k,flag = n;
	while (flag)
	{
		k = flag;
		flag = 0;
		for (int i = 1; i < k; ++i)
		{
			if (a[i - 1]>a[i])
			{
				swap(a + i - 1, a + i);
				flag = i;
			}
		}
	}
}
//插入排序
void insert(int a[], int n)
{
	int temp, j;
	for (int i = 1; i < n; ++i)
	{
		temp = a[i];
		j = i - 1;
		while (j >= 0 && a[j] > temp)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = temp;
	}
}
//希尔排序
void shell(int a[], int n)
{
	int temp, k,i;
	for (int gap = n / 2; gap > 0; gap /= 2)
	{
		for (i = gap; i<n; ++i)
		{
			if (a[i]<a[i - gap])
			{
				temp = a[i];
				k = i - gap;
				while (k >= 0 && a[k]>temp)
				{
					a[k + gap] = a[k];
					k -= gap;
				}
				a[k + gap] = temp;
			}
		}
	}
}
//归并排序
void mergyArray(int a[], int first, int mid, int last, int temp[])
{
	int i = first;
	int j = mid+1;
	int k = 0;
	while (i <= mid && j <= last)
	{
		if (a[i] > a[j])
			temp[k++] = a[j++];
		else
			temp[k++] = a[i++];
	}

	while (i <= mid)
		temp[k++] = a[i++];

	while (i <= mid)
		temp[k++] = a[i++];

	for (i = 0; i<k; ++i)
		a[first + i] = temp[i];
}

void mergeSort(int a[], int first, int last, int temp[])
{
	if (first<last)
	{
		int mid = (first + last) / 2;
		mergeSort(a, first, mid, temp);
		mergeSort(a, mid+1, last, temp);
		mergyArray(a, first, mid, last, temp);
	}
}
void merge(int a[],int n)
{
	int *p = new int[n];
	mergeSort(a, 0, n - 1, p);
	delete[] p;
}


//快速排序
void quickSort(int a[], int n)
{
	if (n>1)
	{
		int *first = a;
		int *last = a + n - 1;
		int x = a[0];
		while (first<last)
		{
			while (first < last && *last >= x)
				--last;
			if (first < last)
				*first++ = *last;

			while (first < last && *first <= x)
				++first;
			if (first < last)
				*last-- = *first;
		}
		*first = x;
		quickSort(a, first - a);
		quickSort(first + 1, n + a - first - 1);
	}
}
void show(int a[], int n)
{
	n = n > 1000 ? 1000 : n;
	for (int i = 0; i < n; ++i)
		printf("%d ", a[i]);
	printf("\n");
}

//堆排序
//堆向上调整
void minHeapFixUp(int a[], int i)
{
	int fa = (i - 1) / 2;
	int temp = a[i];
	while (fa >= 0 && i!=0)
	{
		if (a[fa] <= temp)
			break;

		a[fa] = a[i];
		i = fa;
		fa = (i - 1) / 2;
	}
	a[i] = temp;
}
//堆向下调整
void minHeapFixDown(int a[], int n, int i)
{
	int zi = i * 2 + 1;
	int temp = a[i];
	while (zi < n)
	{
		if (zi + 1 < n && a[zi + 1] < a[zi])
			++zi;
		if (a[zi]>temp)
			break;
		a[i] = a[zi];
		i = zi;
		zi = i * 2 + 1;
	}
	a[i] = temp;
}
//建立最小堆
void MakeMinHeap(int a[], int n)
{
	for (int i = n / 2 - 1; i >= 0; --i)
		minHeapFixDown(a, n, i);
}
//堆排序
void minHeapSort(int a[], int n)
{
	MakeMinHeap(a, n);
	for (int i = n - 1; i >= 1; --i)
	{
		swap(a, a + i);
		minHeapFixDown(a, i, 0);
	}
	int i = 0, j = n - 1;
	while (i < j)
		swap(a[i++], a[j--]);
}
void run_time(void(*p)(int[], int), int a[], int b[],int n)
{
	for (int i = 0; i < N; ++i)
		a[i] = b[i];

	long start = clock();
	p(a, n);
	long val = clock() - start;

	isOrder(a, N);
	cout << "运行时间:" << val << endl << endl;
}

void comp()
{
	int n = N;
	int *a = (int *)malloc(sizeof(int)*N); 
	int *b = (int *)malloc(sizeof(int)*N);
	for (int i = 0; i < N; ++i)
		b[i] = rand() % (N * 2);

	cout << "冒泡排序:";
	//run_time(buble, a,b, n);

	cout << "插入排序:";
	//run_time(insert, a,b, n);

	cout << "希尔排序:";
	run_time(shell, a, b, n);

	cout << "归并排序:";
	run_time(merge, a, b, n);

	cout << "快速排序:";
	run_time(quickSort, a, b, n);

	cout << "堆排序:";
	run_time(minHeapSort, a, b, n);
	
	
}
void main()
{
	srand(time(NULL));
	comp();
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值