首页 > 编程语言 >Lecture 19-平方阶排序算法

Lecture 19-平方阶排序算法

时间:2024-12-19 19:58:27浏览次数:12  
标签:19 复杂度 元素 bound int Lecture 排序 插入排序

直接插入排序

外循环:遍历所有元素,将当前R[i]记为K

内循环:从当前i-1开始,j往前遍历,从右往左找第一个<=当前K的元素R[j],将该元素的右边的第一个元素修改为K

逐个插入,插入时即确定位置

/*直接插入排序*/
void InsertionSort(int R[], int n) {  //对R[1]...R[n]排序
	for (int i = 2; i <= n; i++) {
		int K = R[i], j = i - 1;
		while (j >= 1 && R[j] > K) {  //通过指针j扫描R[i-1]...R[1],从右往左找第1个<=R[i]的元素
			R[j + 1] = R[j];
			j--;
		}
		R[j + 1] = K;
	}
}

时间复杂度及稳定性分析

 

时间复杂度最好平均最坏稳定性
直接插入排序算法O(n)O(n^2)O(n^2)稳定

 

简单冒泡排序

从左往右扫描数组,如果遇到反序对(两个相邻的元素,且前面的元素比后面大),则交换这两个元素。

扫描一趟之后,则最大元素被交换到最右边。

如果把数组立起来,最大元素就像气泡一样,浮到上面。此过程称为一趟冒泡。

外层循环:从n到2,从右向左,依次全部遍历

内层循环:从1到当前bound,从左到右,找逆序对进行交换

/*冒泡排序*/
void SimpleBubbleSort(int R[], int n) {
	for (int bound = n; bound >= 2; bound--) {
		for (int i = 1; i < bound; i++) {
			if (R[i] > R[i + 1])
				swap(R[i] , R[i + 1]);
		}
	}
}

 

 优化冒泡排序

在每趟冒泡过程中,当比较结束后,如果发现位置t是最后依次元素交换的位置,即说明从Rt+1~Rn已经排序

从而下一趟比较只要进行到位置t即可。

这样可以减少算法的关键词比较次数。

void BubbleSort(int R[], int n) {
	int bound = n;  //每趟冒泡排序关键词比较终止位置
	while (bound > 0) {
		int t = 0;  //本趟冒泡元素交换的最后位置
		for (int i = 1; i < bound; i++) {
			if (R[i] > R[i + 1]) {
				swap(R[i], R[i + 1]);
				t = i;
			}
		}
		bound = t;
	}
}

时间复杂度及稳定性分析

时间复杂度最好平均最坏稳定性
冒泡排序O(n)O(n^2)O(n^2)

稳定

直接选择排序

(1)在前n个元素里找最大元素,与R[n]交换,使R[n]就位

(2)在前n-1个元素里找最大元素,与R[n-1]交换,使R[n-1]就位

(3)在前n-2个元素里找最大元素,与R[n-2]交换,使R[n-2]就位

······

以此类推,最后形成递增的有序序列

注意的是,因为交换使得原始顺序被打乱,因此直接选择排序不稳定

/*直接选择排序*/
void SelectionSort(int R[], int n) {
	for (int i = n; i >= 1; i--) {
		//i标识当前处理的子数组的右边界
		//在子数组R[i]...R[i]里找最大元素,和R[i]交换
		int max = 1;
		for (int j = 2; j <= i; i++) {
			if (R[j] > R[max]) max = j;
		}
		swap(R[max], R[i]);
	}
}

时间复杂度及稳定性分析 

时间复杂度最好平均最坏稳定性
直接选择排序O(n^2)O(n^2)O(n^2)不稳定

 

希尔排序

亦称渐进增量排序,是对直接排序算法的改进(可看作直接插入算法的升级版)。

把记录按下标进行分组。

直接插入排序算法在“短文件”、“待排序文件基本有序”时速度快,希尔排序充分利用了这两个特点。

基本过程

(1)将元素分为d组

(2)对每组使用直接插入排序法排序;

(3)把d值减小,重复执行(1)(2),直至d减小到1。

随着增量d逐渐减小,组数越来越少,魅族包含的元素越来越多,当d值减少到1时,整个文件敲好被分成1组,算法终止。

原理:

开始时增量值比较大,每组中的元素较少,插入排序速度较快;

算法执行过程中,随着增量值逐渐变小,每组中元素个数逐渐变多,由于前面工作的基础,大多数元素已基本有序,而插入排序在元素接近有序时速度快。

实现:

分组及对每组插入排序:

无需新开数组,可在原来的大数组上操作;

组内相邻元素的下标间隔d。

/*希尔排序*/
void ShellSort(int R[], int n) {  //对R[1]...R[n]递增排序
	for (int d = n / 2; d > 0; d /= 2) {  //d为增量值
		for (int i = d + 1; i <= n; i++) {  //...R[i-3d],R[i-2d],R[i-d]
			int K = R[i], j = i - d;  //指针j从右往左扫描本组元素
			while (j > 0 && R[j] > K) {  //在本组中从右往左找第1个<=K的元素
				R[j + d] = R[j];
				j -= d;
			}
			R[j + d] = K;
		}
	}
}

时间复杂度及稳定性分析

算法的时间复杂度与所选的增量序列有很大关系;

一般认为平均时间复杂度介于O(N^2)和O(nlogn)之间

稳定性:不稳定

标签:19,复杂度,元素,bound,int,Lecture,排序,插入排序
From: https://blog.csdn.net/fcc13461862452/article/details/144590855

相关文章

  • 12.19 CW 模拟赛 T1. 烟花
    思路转化题意移步赛时记录详细题解见题解下载好的那么主要问题仍然是怎样做才能扔掉后效性,乍一看是不可能的,但是我们可以慢慢的考虑首先我们需要利用有效时间段\(\leq500\)这个条件,我们考虑建出每种选择的情况,再按照树上的仇恨关系建出图具体的,对于每一种\([j......
  • 排序算法(冒泡,快排,归并)
    冒泡排序:(从小到大)1.比较相邻元素,若第一个元素比第二个大,就交换两个2.对相邻元素做同样步骤,从第一对元素到最后一对元素,直到最后的元素最大3.对所有元素重复以上步骤,除了最后一个;重复步骤1-3,直到排序完成publicstaticvoidsort(intw[]){for(inti=0;i<w.length-1;......
  • LeetCode-19. 删除链表的倒数第 N 个结点,关于删除链表会遇见的指针问题
    原题链接前言虽然这道题比较简单,但是我在做这道题时发现了几个需要注意的地方,故写个笔记提一下。正文先将源代码给出来classSolution{public:ListNode*removeNthFromEnd(ListNode*head,intn){ListNode*x=newListNode();x->next=head......
  • 12.19 CW 模拟赛 T2. 数
    思路赛时读错题了,虽然说读对了不一定能做出来,但是还是比较可惜首先阐述一下题意,对\(S\)数组进行插入和删除操作,每次询问让你用\(T\)中的质数组合出\(x\),然后将\(S\)中的数乘以\(x\)之后求最多的完全立方数个数那么显然的,我们对于每一个数,都可以拆成质......
  • 数据结构与算法Python版 插入排序与谢尔排序
    文章目录一、插入排序二、谢尔排序一、插入排序插入排序InsertionSort插入排序维持一个已排好序的子列表,其位置始终在列表的前部,然后逐步扩大这个子列表直到全表第1趟,子列表仅包含第1个数据项,将第2个数据项作为“新项”插入到子列表的合适位置中,这样已排序的......
  • 12.19 CW 模拟赛 赛时记录
    前言考试的时候只需要管考试的策略就行了,其他的想他干嘛看题一般来说,涨信心模拟赛都不会涨信心像一位故人出的题?\(\rm{T1}\)相信自己,冲一下\(\rm{T2}\)看不懂\(\rm{T3}\)博弈\(\rm{T4}\)困难\(\rm{T1}\)机房两青轴是真的蚌埠思路转化题意,对于\(N\)条线......
  • 数据结构与算法Python版 冒泡排序与选择排序
    文章目录一、冒泡排序二、选择排序一、冒泡排序冒泡排序BubbleSort对无序表进行多趟比较交换,每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位经过n-1趟比较交换,实现整表排序。每趟的过程类似于“气泡”在水中不断上浮到水面第1......
  • 对希尔排序的理解——如何从插入排序进化到希尔排序?
    在学习希尔排序的过程中,发现很多博客只在讲希尔排序是什么,没有解释希尔排序是怎么设计的,为什么要使用增量。在开始前,我们要先强调一下,希尔排序的时间复杂度并不固定,它依赖于增量序列的选择。在最坏的情况下,希尔排序的时间复杂度为O(n^2),但是对于某些特定的增量序列,其时间复杂度可......
  • Java如何用HaspMap统计次数并排序详解
    java统计单词频率继上一讲Java用PDFTextStripper来解析pdf文件提取文字-ivanlee717-博客园讲了如何接收和解析pdf之后,我们把pdf文件全部转为了String类型的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。正则过滤首先我们需要把单词弄出来,把其他的文字过滤掉。Pattern......
  • 在 Vue 中实现拖拽排序功能的最佳方式。
    在Vue.js中实现拖拽排序功能,可以使用现成的库来简化开发过程。以下是几种推荐的方法:使用vuedraggable库:vuedraggable是一个基于Sortable.js的Vue组件,它提供了简单易用的API来创建可拖拽和排序的列表。这是最流行的选择之一。安装:npminstallvuedraggable......