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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法_【10】排序(C++实现) -> 正文阅读

[数据结构与算法]数据结构与算法_【10】排序(C++实现)

参考:数据结构与算法基础(青岛大学-王卓)
传送门:
数据结构与算法_【1】概念引入(C++实现)
数据结构与算法_【2】线性表(顺序表链表)(C++实现)
数据结构与算法_【3】栈和队列(C++实现)
数据结构与算法_【4】串数组广义表(C++实现)
数据结构与算法_【5】树和二叉树(C++实现)
数据结构与算法_【6】树和森林(C++实现)
数据结构与算法_【7】哈夫曼树(C++实现)
数据结构与算法_【8】图(C++实现)
数据结构与算法_【9】查找(C++实现)
数据结构与算法_【10】排序(C++实现)

排序

排序就是将无序序列排成一个有序序列
若结点包含多个数据域,排序一般是对于某一个数据域而言的
排序方法分类:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

1 插入排序-直接插入排序

边插入边排序,保证子序列中随时都是排好序的。

在这里插入图片描述在这里插入图片描述

1.1 直接插入排序

在这里插入图片描述在这里插入图片描述

代码:

   void InsertSort(SeqList<int>& L)
    {
    	int i, j;
    	for (i = 2; i < L.size; i++)
    	{
    		if (L.elem[i] < L.elem[i - 1])
    		{
    			L.elem[0] = L.elem[i];//哨兵记录需要插入的元素
    			for (j = i - 1; L.elem[j] > L.elem[0] && j>=1 ;j--)
    			{
    				L.elem[j + 1] = L.elem[j];
    			}
    			L.elem[j + 1] = L.elem[0];//当哨兵值小于当前值,跳出循环,当前索引+1位置插入元素
    		}
    
    	}
    	L.elem[0] = 0;
    	//L.ShowList();
    
    }

性能分析:

在这里插入图片描述

2 插入排序-折半插入排序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RK0Rbhs-1629460006974)(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B010_%E6%8E%92%E5%BA%8F_md_files%5Cimage%20%2813%29.png?v=1&type=image)]

代码:

void BInsertSort(SeqList<int>& L)//折半插入排序
{
	int i, j;
	for (i = 2; i < L.size; 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] < L.elem[mid])
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for (j = i - 1; j >= high + 1; j--)
		{
			L.elem[j + 1] = L.elem[j];
		}
		L.elem[high + 1] = L.elem[0];
	}
	L.elem[0] = 0;
}

性能分析:

在这里插入图片描述在这里插入图片描述

3 插入排序-希尔排序

在这里插入图片描述在这里插入图片描述在这里插入图片描述

代码:

void ShellInsert(SeqList<int>& L, int dk)
{
	int i, j;

	for (i = dk + 1; i < L.size; i++ )
	{
		L.elem[0] = L.elem[i];
		if (L.elem[i] < L.elem[i - dk])
		{
			for (j = i - dk; j >= 1 && L.elem[0] < L.elem[j]; j=j-dk)
			{
				L.elem[j + dk] = L.elem[j];

			}

			L.elem[j + dk] = L.elem[0];
		}
	}

}

void ShellSort(SeqList<int>& L)
{
	int dlta[5] = { 1,3,5,7,11 };
	int t = 4;
	for (int i = 0; i < t; i++)
	{
		ShellInsert(L, dlta[i]);
	}
	L.elem[0] = 0;
}

性能分析:

在这里插入图片描述

4 交换排序-冒泡排序

在这里插入图片描述

代码:

  void BubbleSort(SeqList<int>& L)
    {
    	int i, j, temp;
    	for (i = 1; i < L.size; i++)//帮助确定j需要遍历多少数据
    	{
    		for (j = 1; j < L.size - i; j++)
    		{
    			if (L.elem[j] > L.elem[j+1])//若为逆序,交换
    			{
    				temp = L.elem[j];
    				L.elem[j] = L.elem[j+1];
    				L.elem[j] = temp;
    			}
    		}
    	}
    }

改进的冒泡排序:

  void BubbleSort(SeqList<int>& L)使用flag标志改进冒泡排序
    {
    	int i, j, temp;
    	int flag = 1;
    	for (i = 1; i < L.size && flag==1 ; i++)//帮助确定j需要遍历多少数据
    	{
    		flag = 0;//如果有一次没有发生逆序,flag=0,跳出外层循环!
    		for (j = 1; j < L.size - i; j++)
    		{
    			if (L.elem[j] > L.elem[j+1])//若为逆序,交换
    			{
    				temp = L.elem[j];
    				L.elem[j] = L.elem[j+1];
    				L.elem[j] = temp;
    				flag = 1;
    			}
    		}
    	}
    }

性能分析:

在这里插入图片描述在这里插入图片描述

5 交换排序-快速排序

在这里插入图片描述在这里插入图片描述

代码:

 //Partition 隔断
    int Partition(SeqList<int>& L, int low, int high)//快速排序子程序
    {
    	//L.elem[0] = L.elem[low];
    	int pivotkey = L.elem[low];
    
    	while (low < high)
    	{
    
    		while (low < high && pivotkey <= L.elem[high]) high--;//如果右边元素一直大于隔断元素,则右索引--
    		L.elem[low] = L.elem[high];//右边元素小于隔断值,跳出循环,将元素放在左边
    		while (low < high && pivotkey >= L.elem[low]) low++;
    		L.elem[high] = L.elem[low];
    
    	}
    
    	L.elem[low] = pivotkey;
    	return low;
    }
    
    void Qsort(SeqList<int>& L,int low,int high)//快速排序
    {
    	if (low < high)
    	{
    		int pivotloc = Partition(L, low, high);
    		Qsort(L, low, pivotloc - 1);
    		Qsort(L, pivotloc + 1, high);
    	}
    
    }

性能分析:
是一种不稳定的排序方法!
快速排序不适于对原本有序或者基本有序的记录序列进行排序!

在这里插入图片描述在这里插入图片描述

6 选择排序-简单选择排序

在这里插入图片描述

代码:

 void SelectSort(SeqList<int>& L)
    {
    	for (int i = 1; i <= L.size - 1; i++)
    	{
    		int k = i;
    		for (int j = i + 1; j <= L.size - 1; j++)
    		{
    			if (L.elem[k] > L.elem[j])
    			{
    				k = j;//记录最小值的位置
    			}
    		}
    		if (k != i)
    		{
    			//如果最小值位置不是i,交换i、k
    			int temp = L.elem[i];
    			L.elem[i] = L.elem[k];
    			L.elem[k] = temp;
    		}
    	}
    }

性能分析:

在这里插入图片描述

修改程序可以变为稳定的!

7 选择排序-堆排序

堆:

在这里插入图片描述在这里插入图片描述

堆的调整:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

性能分析:

在这里插入图片描述在这里插入图片描述

8 归并排序

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

9 基数排序

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

10 各种排序方法总结

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:43:11  更:2021-08-21 15:45:01 
 
开发: 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年11日历 -2024/11/25 23:45:27-

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