#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;
}
}
}
直接插入排序 简单选择排序 冒泡排序 快速排序(C++)
最新推荐文章于 2022-03-29 21:24:16 发布