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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 八大排序 (上) -> 正文阅读

[数据结构与算法]八大排序 (上)

一、 直接插入排序

1.概念

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

2.直接插入排序的实现

void insertsort(int* a, int sz)//直接插入排序   [0 end]有序,插入end+1位置的值让[ 0 end+1]也有序
{
	int i = 0;//假设我们要排升序
	for (i = 0; i < sz - 1; i++)//i不能取到sz-1 否则tmp就会造成越界访问
	{
		int end = i;
		int tmp = a[end + 1];//后一个数据
		while (end >= 0)
		{
			if (a[end] > tmp)//如果数组中的数据大于tmp
			{
				a[end+1] = a[end];
				end--;
			}
			else
			{
				break;//找到比tmp小的就结束循环
			}
		}
		a[end + 1] = tmp;//为了防止tmp比所有数据都小这种情况发生
	}
	
}

在这里插入图片描述

直接插入排序的时间复杂度

在这里插入图片描述

二、 希尔排序

1.概念

思想为 :先选定一个整数,把 待排序文件中所有记录分组,所有距离内的记录在同一组中,再对每一组内的记录进行排序,重复分组和排序, 直到=1时结束.

希尔是直接插入排序的优化
1.先进行预排序,让数组接近有序
2.直接插入排序

在这里插入图片描述

此时发现: 多组间隔为gap的预排序,gap由大变小
gap 越大,大的数越快到后面,小的数越快到前面
gap越大,预排完,越不接近有序,
gap越小,预排完,越接近有序
当gap=1时,就时直接插入排序

2. 希尔排序的实现

void shellsort(int* a, int n)//希尔排序
{
	int i = 0;
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1; //间隔为gap的多组数据同时排
		for (i = 0; i < n - gap; i++)//如果gap换成1  那就是直接插入排序
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

3. 希尔排序的时间复杂度

  1. gap=n , gap=gap/3+1 即 n=n/3+1
    假设 x为操作次数 3^x=n+1 x=log 3 n+1
    时间复杂度为 O(log 3 N)

2.预排序会使数组接近有序 ,如gap=1 时 ,就为直接插入排序,时间复杂度为O(N)
在这里插入图片描述

希尔排序 整体时间复杂度为O(N *log 3 N )

三、 直接选择排序

1.直接选择排序的实现


void selectsort(int arr[], int n)//直接选择排序
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{

		int max = begin;
		int min = begin;
		int i = 0;
		for (i = begin; i <= end; i++)
		{
			if (arr[i] < arr[min])
			{
				min = i;//通过交换找到最大值坐标
			}
			if (arr[i] > arr[max])
			{
				max = i;//通过交换找到最小值坐标
			}
		}
		swap(&arr[begin], &arr[min]);//通过坐标将最小值交换到第begin个
		if (begin == max)
		{
			max = min;
		}
		swap(&arr[end], &arr[max]);//通过坐标将最大值交换到第end个
		begin++;
		end--;
	}
}

在这里插入图片描述

2.注意事项

在这里插入图片描述

3.直接选择排序的时间复杂度

直接选择排序 ,无论 数组处于 有序 (最好情况下),还是无序 (最坏情况下) 都需要将整个数组遍历一遍 ,
时间复杂度为O(N^2)

四、 堆排序

点击这里 :堆排序详解

五、冒泡排序

1.冒泡排序的实现

void bubblesort(int* a, int sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)// i代表趟数  i在倒数第二次就已经把数组排好了 
	{
		int exchange = 0;
		for (j = 0; j < sz - 1 - i; j++)//j代表每趟的对数 
		{
			if (a[j] > a[j + 1])
			{
				int tmp = 0;
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				exchange = 1;
			}
		}
		if (exchange == 0)//说明遍历一遍都没有进行比较,则有序
		{
			break;
		}
	}
}

在这里插入图片描述

2.冒泡排序的时间复杂度

正常情况下:
第一趟时,共比较 n-1次 ,
第二趟时,共比较n-2 次,
第n-1趟时,共比较1次
操作次数为: n-1+n-2+n-3+…+1=n(n-1)/2
通过大O渐进法省略 ,时间复杂度为O(N^2)

最好情况下:
数组为有序时 ,如 : 1 2 3 4 5
正好排升序,遍历一遍后发现并没有进入交换中,exchange==0则跳出循环。
时间复杂度为O(N)

3.冒泡排序与直接插入排序谁更好?

当数组接近有序时 ,如: 1 2 3 5 4 6
1.冒泡排序:
在这里插入图片描述

2.直接插入排序:
1 2 3 5 4 6
在这里插入图片描述
时间复杂度为O(N)

则直接插入排序更优

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

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