插入排序、快速排序、归并排序、希尔排序

Written by Robert_Wang in Southwest University of Science And Technology.

#include<iostream>
#include<algorithm>
using namespace std;
void InsertSort(int data[], int n)
{
	int p = 1, i, j, temp;
	for (i = 1; i < n; i++)
	{
		for (j = i - 1; j >= 0; j--)
		{
			if (data[j] <= data[j + 1]) break;
			swap(data[j], data[j + 1]);
		}
	}
}
/*
归并排序——分治法
*/
void mergeSrot(int data[], int start, int end)
{
	if (start >= end) return;
	int mid = (start + end) / 2;
	mergeSrot(data, start, mid);
	mergeSrot(data, mid+1, end);
	int *tem = new int[end+1];
	int p1 = start;
	int p2 = mid + 1;
	int p3 = 0;
	while (p1 <= mid && p2 <= end)
	{
		if (data[p1] < data[p2]) {
			tem[p3++] = data[p1++];
		}else {
			tem[p3++] = data[p2++];
		}
	}
	while (p1 <= mid)	tem[p3++] = data[p1++];
	while (p2 <= end)	tem[p3++] = data[p2++];
	int i;
	for (i = start; i <= end; i++) data[i] = tem[i - start];
	delete[] tem;
}
//线段树区间分心
void quicksort1(int data[], int left, int right)
{
	if (left >= right) return;
	int p = left;
	int i;
	for (i = left; i <= right; i++)
	{
		if (data[i] < data[p])
		{
			swap(data[i], data[p]);
			swap(data[p + 1], data[i]);
			p++;
		}
	}
	quicksort1(data, left, p - 1);
	quicksort1(data, p+1, right);
}
void quicksort2(int data[], int left, int right)
{
	if (left >= right) return;
	int i = left, j = right;
	int temp = data[i];
	while (i<j)
	{
		while (i < j && data[j] > temp)
			j--;
		while (i < j && data[i] < temp)
			i++;
		if (i < j) swap(data[i], data[j]);
	}
	data[i] = temp;
	quicksort2(data, left, i-1);
	quicksort2(data, i+1, right);
}
/*
希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
*/
void shellSort(int data[],int n)//这是一种不稳定的排序方法
{
	int gap;
	int i, j;
	for (gap = n / 2; gap > 0; gap /= 2)//间隔所变化的次数
	{
		for (i = gap; i < n; i++)//间隔的数处理
		{
			int j = i;
			for (j = i; j - gap >= 0, data[j] < data[j - gap]; j -= gap)	swap(data[j], data[j - gap]);
		}
	}
}
int main()
{
	int data[100];
	int i, n;
	cin >> n;
	for (i = 0; i < n; i++) cin >> data[i];
	//quicksort1(data, 0, n - 1);
	//quicksort2(data, 0, n - 1);
	//shellSort(data, n);
	//InsertSort(data, n);
	//mergeSrot(data, 0, n - 1);
	for (i = 0; i < n; i++) cout<<data[i]<<" ";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40883132/article/details/79857324