直接插入排序 简单选择排序 冒泡排序 快速排序(C++)

#include<iostream>
#include <stdlib.h>
#include<time.h>//生成随机数需要用到的一个头文件
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef struct {
	ElemType elem[MAXSIZE + 1]; //数据元素存储空间基址, 0 号单元留空
	int length; //表长度
}SqList;
//创建排序表
void Create(SqList &L) {
	//利用循环,生成 MAXSIZE 个随机数,存储在 elem 数组
	//为查找表长度赋值
	L.length = MAXSIZE;
	for (int i = 1; i < MAXSIZE + 1; i++)
	{
		//srand((unsigned)time(NULL));
		L.elem[i] = rand();



	}
}
//输出排序表元素
void Traverse(SqList L)
{
	//利用循环依次输出排序表元素
	for (int i = 1; i < MAXSIZE + 1; i++)
		cout << L.elem[i] << " ";
}
//直接插入排序
void InsertSort(SqList &ST) {
	int i, j;

	for (i = 2; i <= ST.length; i++)//一个有序表,一个无序表,插入到有序表中
	{//i=2,一个元素单独本身就是有序的,就分割开来一个有序表一个无序表
		if (ST.elem[i] < ST.elem[i - 1])
		{
			ST.elem[0] = ST.elem[i];//设立哨兵




			for (j = i - 1; ST.elem[0] < ST.elem[j]; j--)//从后往前比较 j=i-1 是跟要比较的前一个数比较 所以减一
				ST.elem[j + 1] = ST.elem[j];//元素移动
			ST.elem[j + 1] = ST.elem[0];//找到j那个下标了,但要放在它的后一位,后面才是空着的,所以j+1
		}
	}

}
//冒泡排序
void BubbleSort(SqList &L)
{
	int temp;
	for (int i = 1; i < MAXSIZE; i++)
	{
		for (int j = 1; j < MAXSIZE +1 -i; j++)//j< MAXSIZE+1-i比较大趟数
		{
			if (L.elem[j] > L.elem[j + 1])
			{
				temp = L.elem[j];
				L.elem[j] = L.elem[j + 1];
				L.elem[j + 1] = temp;
			}


		}


	}
}
//确定中心轴的位置 进行一次快速排序
int pivotloc(SqList &L, int low, int high)
{
	L.elem[0] = L.elem[low];//一般用第一个元素作为中心轴 后面的元素跟他进行比较
	while (low < high) {//low等于high的时候是个空位,空位最后就放中心轴
		while (L.elem[high] > L.elem[0] && low < high)//比中心轴的元素小,移到前面来
		//high的元素比中心轴的元素大进入循环,high移动
			--high;
		L.elem[low] = L.elem[high];//把后面小的放到前面来
		
		while (L.elem[low] < L.elem[0] && low < high)//比中心轴的元素大,移到后面去

			++low;
		L.elem[high] = L.elem[low];//把前面大的放到后面
			
		
	}
	L.elem[low] = L.elem[0];
	return low;
}
//快速排序 设定一个中心轴 分成两个子表 两个子表继续用同样的方法 用递归的思想
void QuickSort(SqList &L, int low, int high)
{
	int i;
	if (low < high)//长度大于1
	{
		i = pivotloc(L, low, high);//将表一分为二
		QuickSort(L, low, i - 1);
		QuickSort(L, i + 1, high);
	}




}
//简单选择排序
void SelectSort(SqList &L)
{
	int temp;
	for (int i = 1; i < L.length; i++)
	{
		int k = i;//后面的数依次和第k个比大小,比他小的就交换
		for (int j = i + 1; j <= L.length; j++)
		{
			if (L.elem[j] < L.elem[k])
				k = j;
		}
		if (k != i)//说明k的值变了,进入了循环 交换值
		{
			temp = L.elem[i];
			L.elem[i] = L.elem[k];
			L.elem[k] = temp;

		}
	}

}
int main(void)
{
	SqList L;
	int c = 0;
	while (c != 5)
	{
		cout << endl << "1. 直接插入排序";
		cout << endl << "2. 冒泡排序";
		cout << endl << "3. 快速排序";
		cout << endl << "4. 简单选择排序";
		cout << endl << "5. 退出";
		cout << endl << "选择功能(1~5):";
		cin >> c;
		switch (c)
		{
		case 1:
			Create(L);
			cout << "排序前数据: ";
			Traverse(L);
			cout << endl;
			InsertSort(L);
			cout << "排序后数据: ";
			Traverse(L);
			break;
		case 2:
			Create(L);
			cout << "排序前数据: ";
			Traverse(L);
			cout << endl;
			BubbleSort(L);
			cout << "排序后数据: ";
			Traverse(L);
			break;
		case 3:
			Create(L);
			cout << "排序前数据: ";
			Traverse(L);
			cout << endl;
			QuickSort(L,1,100);
			cout << "排序后数据: ";
			Traverse(L);
			break;
		case 4:
			Create(L);
			cout << "排序前数据: ";
			Traverse(L); 
			cout << endl;
			SelectSort(L);
			cout << "排序后数据: ";
			Traverse(L);
			break;
		case 5:
			cout << "结束操作" << endl;
			break;
		}
	}
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值