网站首页 > 基础教程 正文
如下图所示的代码,是《大话数据结构》第9章节中的七大排序算法汇总,本人写了一个main主函数来进行算法排序的测试,只要把代码运行起来后在终端中输入10个数字然后回车就能把所有排序算法的结果打印出来,如果需要输入其他数目的数字,只需要修改代码中最前面定义的MAXSIZE函数就行。
#include<iostream>
using namespace std;
constexpr auto MAXSIZE = 10;
typedef int status;
typedef struct
{
int r[MAXSIZE + 1];
int length;
}SqList;
void swap(SqList* L, int i, int j);
//简单比较排序
void BubbleSort0(SqList* L);
//冒泡排序函数声明
void BubbleSort(SqList* L);
//插入排序函数声明
void InsertSort(SqList* L);
//希尔排序函数声明
void ShellSort(SqList *L);
//堆排序用到的函数声明
void HeapSort(SqList *L);
void HeapAdjust(SqList *L,int s,int m);
//归并排序用到的函数声明
void MergeSort(SqList *L);
void MSort(int SR[],int TR1[],int s,int t);
void Merge(int SR[],int TR[],int i,int m,int n);
//快速排序用到的函数声明
void QuickSort(SqList* L);
void QSort(SqList *L,int low,int high);
int Partition(SqList *L,int low,int high);
/*交换L中数组r的下标为i和j的值*/
void swap(SqList* L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
//一、直接简单比较来排序
void BubbleSort0(SqList* L)
{
for (int i = 1; i < L->length; i++)
{
for (int j = i + 1; j <= L->length; j++)
{
if (L->r[i] > L->r[j])
{
swap(L, i, j);
}
}
}
}
//二、冒泡排序
void BubbleSort(SqList* L)
{
for (int i = 1; i < L->length; i++)
{
for (int j = L->length - 1; j >= i; j--)
{
if (L->r[j] > L->r[j + 1])
{
swap(L, j, j + 1);
}
}
}
}
//三、直接插入排序
void InsertSort(SqList* L)
{
int i, j;
for (i = 2; i <= L->length; i++)
{
if (L->r[i] < L->r[i - 1])
{
L->r[0] = L->r[i];
for (j = i - 1; L->r[j] > L->r[0]; j--)
{
L->r[j + 1] = L->r[j];
}
L->r[j + 1] = L->r[0];
}
}
}
//四、希尔排序
void ShellSort(SqList* L)
{
int i, j;
int increment = L->length;
do
{
increment = increment / 3 + 1;
for ( i = 1+increment; i <= L->length; i++)
{
if (L->r[i]<L->r[i-increment])
{
L->r[0] = L->r[i];
for ( j = i-increment; j > 0 && L->r[0]<L->r[j]; j-=increment)
{
L->r[j + increment] = L->r[j];
}
L->r[j + increment] = L->r[0];
}
}
} while (increment>1);
}
//五、堆排序
void HeapSort(SqList* L)
{
//把L中的顺序表r构建成大顶堆的数字排列
int i;
for ( i = L->length; i > 0; i--)
{
HeapAdjust(L,i,L->length);
}
//开始不断循环进行堆排序(截取根节点)和不断进行堆调整
for ( i = L->length; i > 1; i--)
{
swap(L,1,i);
HeapAdjust(L,1,i-1);
}
}
//大顶堆构建函数
void HeapAdjust(SqList* L, int s, int m)
{
int temp, j;
temp = L->r[s];
for ( j = 2*s; j <= m; j*=2)
{
if (j<m && L->r[j]<L->r[j+1])
{
++j;
}
if (temp>=L->r[j])
{
break;
}
L->r[s] = L->r[j];
s = j;
}
L->r[s] = temp;
}
//六、归并排序
void MergeSort(SqList* L)
{
MSort(L->r,L->r,1,L->length);
}
void MSort(int SR[], int TR1[], int s, int t)
{
int m;
int TR2[MAXSIZE+1];
if (s==t)
{
TR1[s] = SR[s];
}
else
{
m = (s + t) / 2;
MSort(SR, TR2, s, m);
MSort(SR, TR2,m+1, t);
Merge(TR2,TR1,s,m,t);
}
}
void Merge(int SR[], int TR[], int i, int m, int n)
{
int j, k, l;
for ( j = m+1,k=i;i<=m && j<=n; k++)
{
if (SR[i]<SR[j])
{
TR[k] = SR[i];
i++;
}
else
{
TR[k] = SR[j];
j++;
}
}
if (i<=m)
{
for ( l = 0; l <= m-i; l++)
{
TR[k + l] = SR[i + l];
}
}
if (j<=n)
{
for (l = 0; l <= n - j; l++)
{
TR[k + l] = SR[j + l];
}
}
}
//七、快速排序
void QuickSort(SqList* L)
{
QSort(L,1,L->length);
}
void QSort(SqList* L, int low, int high)
{
int pivot;
if (low<high)
{
pivot = Partition(L,low,high);
QSort(L,low,pivot-1);
QSort(L,pivot+1,high);
}
}
int Partition(SqList* L, int low, int high)
{
int pivotkey;
pivotkey = L->r[low];
while (low<high)
{
while (low<high && L->r[high]>=pivotkey)
{
high--;
}
swap(L,low,high);
while (low<high && L->r[low]<=pivotkey)
{
low++;
}
swap(L,low,high);
}
return low;
}
int main()
{
cout << "请输入" << MAXSIZE << "个数字:" << endl;
int num;
SqList L;
L.length = MAXSIZE;
for (int i = 1; i <= MAXSIZE; i++)
{
cin >> L.r[i];
}
//简单排序并输出排序结果
BubbleSort0(&L);
cout << "简单排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//冒泡排序并输出排序结果
BubbleSort(&L);
cout << "冒泡排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//直接插入排序并输出排序结果
InsertSort(&L);
cout << "直接插入排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//希尔排序并输出排序结果
ShellSort(&L);
cout << "希尔排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//堆排序并输出排序结果
HeapSort(&L);
cout << "堆排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//归并排序并输出排序结果
MergeSort(&L);
cout << "归并排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
//快速排序并输出排序结果
QuickSort(&L);
cout << "快速排序后输出的结果是:" << endl;
for (int i = 1; i <= MAXSIZE; i++)
{
cout << L.r[i] << " ";
}
cout << endl;
return 0;
}
猜你喜欢
- 2024-10-19 盘点数据结构的应用场景 数据结构主要研究什么应用问题中的数据
- 2024-10-19 c++之stl底层数据结构 c++stl库详解教程
- 2024-10-19 C语言数据结构实现:迷宫问题的通用解法
- 2024-10-19 Golang数据结构可视化库DataViz golang data race
- 2024-10-19 C/C++编程笔记:数据结构二叉树查找前序、中序、后序、层序遍历
- 2024-10-19 当 Java 遇上 C++: 使用 JNA 传递复杂数据结构
- 2024-10-19 C++并发编程实战:基于锁的并发数据结构
- 2024-10-19 《大话数据结构》C++实现二叉平衡树的建立
- 2024-10-19 数据结构(C++版)邓俊辉 学习笔记——第一章要点摘录
- 2024-10-19 C++ Qt面试题24:常用数据结构有哪些?
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)