6种基础排序算法

#include<iostream>
using namespace std;
int temp[10];
class SORT {
public:
	SORT()
	{
		for (int i = 0; i < Arrzy_Size; i++)
		{
			cout << "请输入第"<<i+1<<"个数:";
			cin >> a[i];
		}
		cout << "-----------------------" << endl;
		cout << "请选择排序算法" << endl;
		cout << "1.插入排序" << endl;
		cout << "2.冒泡排序" << endl;
		cout << "3.快速排序" << endl;
		cout << "4.简单选择排序" << endl;
		cout << "5.归并排序" << endl;
		cout << "6.堆排序" << endl;
		cin >> choice;
		switch (choice)
		{
		case 1:InsertSort(); Printf(); break;
		case 2:BubbleSort(); Printf(); break;
		case 3:quick_sort(0,Arrzy_Size-1); Printf(); break;
		case 4:Select_sort(); Printf(); break;
		case 5:Merge_sort(0,Arrzy_Size-1); Printf(); break;
		case 6:for (int i = (Arrzy_Size-1) / 2; i >=1; i--) down(i);  Printf(); break;
		default:exit(0);
		}
	}
private:
		void InsertSort()//插入排序
		{
			int i, j, temp;
			for( i = 1;i<Arrzy_Size;i++)
				if (a[i] < a[i - 1])//如果i位置的值比前一个位置的值小,需要在前面的有序序列中插入当前i的值
				{
					temp = a[i];//记录当前i位置的值
					for (j = i - 1; j >= 0 && a[j] > temp; j--)//j<0或a[j]<=temp时跳出循环
						a[j + 1] = a[j];
					a[j + 1] = temp;
				}
		}
		void BubbleSort()//冒泡排序
		{
			for (int i = 0; i < Arrzy_Size; i++)
			{
				bool flag = false;
				for (int j = Arrzy_Size - 1; j > i; j--)
				{
					if (a[j - 1] > a[j]) {
						swap(a[j - 1], a[j]);
						flag = true;
					}
				}
				if (flag == false)return;//如果一趟冒泡排序没有发生交换,则说明已经有序,可以提前退出循环
			}
		}
		void quick_sort(int l,int r	)//快速排序
		{
			if (l == r)return;
			int i = l - 1, j = r + 1;
			int x = a[l + r >> 1];
			while (i<j)
			{
				do i++; while (a[i] < x);
				do j--; while (a[j] > x);
				if (i < j)swap(a[i], a[j]);
			}
			quick_sort(l, j);
			quick_sort(j + 1, r);
		}

		void Select_sort()//简单选择排序
		{
			for (int i = 0; i < Arrzy_Size; i++)
			{
				int min = i;
				for (int j = i + 1; j < Arrzy_Size; j++)
					if (a[j] < a[min]) min = j;
				if (min != i)swap(a[i], a[min]);
			}
		}

		void Merge_sort(int l, int r)//归并排序
		{
			if (l == r)return;
			int mid = l + r >> 1;
			Merge_sort(l, mid), Merge_sort(mid + 1, r);
			int i = l, j = mid+1,k = 0;
			while (i <= mid && j <= r)
			{
				if (a[i] <= a[j])temp[k++] = a[i++];
				else temp[k++] = a[j++];
			}
			while(i<=mid)temp[k++] = a[i++];
			while(j<=r)temp[k++] = a[j++];
			for (int i = l, j = 0; i <= r; i++, j++)a[i] = temp[j];
		}

		void down(int u)//堆排序
		{
			int t = u;
			if (2 * u <= Arrzy_Size && a[2 * u] < a[t]) t = 2 * u;
			if (2 * u + 1 <= Arrzy_Size && a[2 * u + 1] < a[t])t = 2 * u + 1;
			if (u != t)
			{
				swap(a[u], a[t]);
				down(t);
			}
		}
	
	void Printf()
	{
		cout << "排序结果:";
		for (int i = 0; i < Arrzy_Size; i++)
		{
			cout << a[i] << " ";
		}
		cout << endl;
	}
	int choice;
	static const int Arrzy_Size = 10;
	int a[Arrzy_Size];
};
int	main()
{
	SORT test;
	system("pause");
	return 0;
}

对于堆排序代码需要特别处理,不能down(0)会出现不可预知的结果
所以堆的数据从a[1]开始存到a[9]只有9个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值