IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构各种排序算法C++实现 -> 正文阅读

[数据结构与算法]数据结构各种排序算法C++实现

数据结构各种排序算法C++实现

包含了直接插入排序,折半插入排序,希尔排序,冒泡排序,快速排序,选择排序,归并排序,这几种排序的算法实现。堆排序和基数排序没写,觉的代码实现起来有点难,明白了思路但是没写。哈哈哈!
代码:

#include <stdlib.h>
#include <iostream>
using namespace std;

#define MAXSIZE 100  //顺序表大小,即为一共能存储的记录数(数据)

typedef struct{   //元素只有一个浮点型数据的结构体数组
	int p;
} Elem;

typedef struct{   //定义一个名称为Sqlist的顺序表,*elem 代表上面那个结构体数组首元素的地址
	Elem *elem;
	int length;
}Sqlist;

int InitList_Sq(Sqlist &L) //初始化顺序表
{
	float c = 0.0; int i;
	L.elem = new Elem[MAXSIZE+1];  //C++的定义结构体数组大小,C语言:L.elem = (Elem *)malloc(sizeof(Sqlist)*MAXSIZE);
	if (!L.elem)
		exit(-1);
	else
		L.length = 1;
	cout << "顺序表创建成功!请添加新建数据!按0结束!";  //结束条件可更改(更改需要改一下浮点型的数据类型)

	for (i = 1; i < MAXSIZE; i++)
	{
		if (L.elem[i - 1].p == c)
		{
			break;
		}
		else
			cin >> L.elem[i].p;
	}
	L.length = i-1;
	return 1;
}


int GetLength(Sqlist &L){  //获取顺序表的长度
	return L.length;
}



void PrintList(Sqlist &L){   //输出顺序表数据
	if (L.length == 0)
	{
		cout << "此顺序表不存在或无数据元素!";
		exit(-2);
	}
	else
	{
		for (int i = 1; i < L.length; i++)
		{
			int e = L.elem[i].p;
			cout << e;
		}
	}
}







void Circle_L(Sqlist &L)
{
	cout << "请输入循环左移位数:";
	int k;
	float b[MAXSIZE];
	cin >> k;
	k = k%L.length;
	for (int i = 0; i < k; i++)
	{
		b[i] = L.elem[i].p;
	}
	for (int i = 0; i <= k; i++)
	{
		L.elem[i].p = L.elem[k + i].p;
	}
	for (int i = 0; i < k; i++)
	{
		L.elem[((L.length) - k + i) % L.length].p = b[i];
	}
	PrintList(L);
}

void DirectOrderInsert(Sqlist &L)  //直接顺序插入排序
{
	int i, j;
	for (i = 2; i < L.length; i++)
	{
		if (L.elem[i].p < L.elem[i - 1].p)
		{
			L.elem[0] = L.elem[i];
			for (j = i - 1; L.elem[0].p < L.elem[j].p; --j)
			{
				L.elem[j + 1] = L.elem[j];
			}
			L.elem[j + 1] = L.elem[0];
		}
	}
}

void BiInserSort(Sqlist &L)  //折半插入排序
{
	for (int i = 2; i < L.length; i++)
	{
		L.elem[0] = L.elem[i];
		int low = 1;
		int high = i - 1;
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (L.elem[0].p < L.elem[mid].p)
				high = mid - 1;
			else
				low = mid + 1;
		}  //以上的作用是通过折半查询的犯法找到元素的插入位置
		for (int j = i - 1; j >= high + 1; --j) //以下代码是将数据插入已经找到的位置上
		{
			L.elem[j + 1] = L.elem[j];
		}
		L.elem[high + 1] = L.elem[0];
	}
}

void shell_Insert(Sqlist &L, int dk)  //希尔排序-分组
{
	int i, j;
	for (i = dk+1; i < L.length; i++)
	{
		if (L.elem[i].p < L.elem[i - dk].p)
		{
			L.elem[0] = L.elem[i];
			for (j = i - dk; j>0 && (L.elem[0].p < L.elem[j].p); j = j - dk)
				L.elem[j + dk] = L.elem[j];
			L.elem[j+dk] = L.elem[0];   //好好演示一下,这个地方比较难理解
		}
	}
}

void shellsort(Sqlist &L ,int data[],int t)  //希尔排序-确定分组间隔
{
	for (int k = 0; k < t; k++)
	{
		shell_Insert(L, data[k]);
	}
}


void bubble_sort(Sqlist &L)  // 冒泡排序(改进)
{
	int i, j, k;
	int flag = 1;
	int n = L.length - 1;
	for (i = 1; i <= n-1 && flag==1; i++)   //n个数据一共需要比较n-1趟
	{
		flag = 0;
		for (j = 1; j <= n - i; j++)  //每一趟中需要比较n-i次
		{
			if (L.elem[j].p>L.elem[j + 1].p)  //如果前面的大于后面的需要交换,否则不用
			{
				flag = 1;
				k = L.elem[j].p;
				L.elem[j].p = L.elem[j + 1].p;
				L.elem[j + 1].p = k;
			}
		}
	}
}

int portition(Sqlist &L, int low, int high)   //快速排序分区间
{
	L.elem[0] = L.elem[low];
	int protkey = L.elem[low].p;
	while (low < high)
	{
		while (low < high && L.elem[high].p >= protkey) --high;
		L.elem[low] = L.elem[high];
		while (low < high && L.elem[high].p < protkey) ++low;
		L.elem[high] = L.elem[low];
	}
	L.elem[low] = L.elem[0];
	return low;
}

void Qsort(Sqlist L, int low, int high)  //快速排序递归调用
{
	int mid;
	if (low < high)
	{
		mid = portition(L, low, high);
		Qsort(L, low, mid - 1);
		Qsort(L, mid + 1, high);
	}
}



void Select_Sort(Sqlist &L)  //简单选择排序
{
	int i, j,k;
	Elem t;
	int n = L.length - 1;
	for (i = 1; i < n; i++)
	{
		k = i;
		for (j = i+1; j <= n; j++)
		{
			if (L.elem[j].p < L.elem[k].p)
			{
				k = j;
			}
			if (k != i)
			{
				t = L.elem[i];
				L.elem[i] = L.elem[k];
				L.elem[k] = t;
			}
		}
	}
}

void merge(Sqlist &L,int low, int mid, int high)  //归并比较排序的过程
{
	Elem place[MAXSIZE];
	int i = low, j = mid + 1, k = low;
	while (i <= mid && j <= high)
	{
		if (L.elem[i].p < L.elem[j].p)
		{
			place[k++] = L.elem[i++];
		}
		else
		{
			place[k++] = L.elem[j++];
		}
	}
	while (i <= mid)
	{
		place[k++] = L.elem[i++];
	}
	while (j <= high)
	{
		place[k++] = L.elem[j++];
	}
	for (int i = low; i <= high; i++)
	{
		L.elem[i] = place[i];
	}
}

void mergesort(Sqlist &L,int a,int b) //分开的递归过程
{
	if (a >= b)
		return;
	int mid = (a + b) / 2;
	mergesort(L,a, mid);
	mergesort(L,mid + 1, b);
	merge(L,a, mid, b);
}

void Contents()  //菜单清单
{
	cout << "***************************************\n";
	cout << "*            顺 序 表 练 习           *\n";
	cout << "*                                     *\n";
	cout << "*       1.建立顺序表并录入数据        *\n";
	cout << "*       2.查看顺序表数据              *\n";
	cout << "*       3.退出程序                    *\n";
	cout << "*       4.获取顺序表长度              *\n";
	cout << "*       5.循环左移                    *\n";
	cout << "*       6.直接顺序插入排序(插入排序)*\n";
	cout << "*       7.折半插入排序(插入排序)    *\n";
	cout << "*       8.希尔排序(插入排序)        *\n";
	cout << "*       9.冒泡排序(交换排序)        *\n";
	cout << "*       10.快速排序(交换排序)       *\n";
	cout << "*       11.简单选择排序(选择排序)   *\n";
	cout << "*       12.归并排序                   *\n";
	cout << "***************************************\n";
}

void main(){   //主函数


	Sqlist L;
	Elem e;
	int data[3] = { 4, 2, 1 };
	int flag, a, n, b;
	float k;
	flag = 1;
	while (flag)
	{
		system("cls");
		Contents();
		cin >> a;
		switch (a)
		{
		case 1: if (InitList_Sq(L)){ cout << "数据录取完毕!"; system("PAUSE"); break; }
				else{ cout << "失败!"; break; }
		case 2: PrintList(L); system("PAUSE"); break;
		case 3: exit(-1);
		case 4:	cout << GetLength(L); system("PAUSE"); break;
		case 5: Circle_L(L); system("PAUSE"); break;
		case 6: DirectOrderInsert(L); system("PAUSE"); break;
		case 7: BiInserSort(L); system("PAUSE"); break;
		case 8: shellsort(L,data,3); system("PAUSE"); break;
		case 9: bubble_sort(L); system("PAUSE"); break;
		case 10: Qsort(L, 1, L.length-1); system("PAUSE"); break;
		case 11: Select_Sort(L); system("PAUSE"); break;
		case 12: mergesort(L,1,L.length-1); system("PAUSE"); break;
		default: printf("输入错误!请重新输入"); system("PAUSE"); break;
		}
	}
}

请添加图片描述
不太会调图片的大小,大家凑活看吧!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 17:08:43  更:2021-10-01 17:09:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 9:49:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码