首页 > 编程语言 >【八大数据排序法】选择排序法的图形理解和案例实现 | C++

【八大数据排序法】选择排序法的图形理解和案例实现 | C++

时间:2023-02-01 13:00:26浏览次数:419  
标签:八大 复杂度 元素 C++ 选择 算法 排序 数据

image.png

第十五章 选择排序法


::: hljs-center

目录

第十五章 选择排序法

●前言

●认识排序

●一、选择排序法是什么?

1.简要介绍

2.图形理解

3.算法分析

●二、案例实现

1.案例一

● 总结

:::

前言

排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。


认识排序

排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。


一、选择排序法是什么?

1.简要介绍

选择排序法属于枚举法的一种应用,它就是反复地从未排序的数列中找出最小的数据元素,再将其与某个指定位置的数据元素进行交换,经过每次扫描都可以把该次扫描时数列中的数据元素的最小的那个放到前面的指定位置,从而最终得到的结果就是排序后的数列。

2.图形理解

下面我们用选择排序法对下图中的这5个数据元素进行从小到大的排序: image.png 首先找到这5个数据元素中的最小值,并且与数列中的第一个元素进行交换,如图所示: image.png 从第二个值开始找,找到此时剩余的四个数据元素(不包含第一个)中的最小值,再与第二个数据元素进行交换,如图所示: image.png 从第三个值开始找,找到此时剩余的三个数据元素(不包含第一个、第二个)中的最小值,再与第三个数据元素进行交换,如图所示: image.png 从第四个值开始找,找到此时剩余的两个数据元素(不包含第一个、第二个、第三个)中的最小值,再与第四个数据元素进行交换。这样经过四次扫描下来也就完成了对这5个数据的全部排序,如图所示: image.png

3.算法分析

n个元素的选择排序法需要执行n-1次扫描排序操作: ①选择排序法是以最大值或最小值直接与最前方未排序的键值进行交换,数据排列的顺序可能被改变,所以它不属于稳定排序。 ②选择排序法只需要一个额外的空间,所以空间复杂度为最佳。 ③选择排序法比较适用于数据量小或已经有部分数据排好序的情况。 ④该排序法无论是最坏情况,最好情况还是平均情况它都是需要去找到最大值或最小值,因此其时间复杂度为O(n^2)。

二、案例实现

1.案例一

①范例情况:使用选择排序法对9,7,5,3,4,6这六个数据进行从小到大的排序,并且输出每次扫描下的排序情况。 ②代码展示:

#include<iostream>
#include<iomanip>
using namespace std;
#define size 6 //事先声明排序数据的个数
class select {
public:
	int data[size];
	void showresult(){
		for (int i = 0; i < size; i++)
			cout << setw(2) << data[i];
		cout << endl;
	}
	void select_start() {
		for (int i = 0; i < size-1; i++)      //扫描5次
		{ 
			for (int j = i + 1; j < size; j++)    //从i+1个数据起开始比较,目的就是从中找出最小值
			{
				if (data[i] > data[j])     //比较第i个和第j个元素
				{
					int temp;
					temp = data[i];
					data[i] = data[j];
					data[j] = temp;
				}
			}
			cout << "第" <<  i+1 << "次扫描:";
			showresult();
		}
	}
};
void text()
{
	select s;
	cout << "请输入要排序的"<<size<<"个数据"<< endl;
	for (int i = 0; i < size; i++)
		cin>>s.data[i];
	cout << "排序前:" << endl;
	s.showresult();
	s.select_start();
	cout << "排序后:" << endl;
	s.showresult();
}
int main()
{
	text();
}

③结果展示: image.png


总结

以上就是对选择排序法的简单讲解,以上的案例实现中我们运用的是简单的直接选择排序的一种思想,在后续的章节中会陆续讲到树形选择排序和堆排序来进阶的去体会选择排序法带给我们的排序编程思想。

<您的三连和关注是我最大的动力>

标签:八大,复杂度,元素,C++,选择,算法,排序,数据
From: https://blog.51cto.com/zhangzhichaoya/6031417

相关文章

  • (转)Golang sort包排序(详细全集)
    原文:https://blog.csdn.net/qq_43279457/article/details/121730095一、整型首先用下里面提供的最简单的例子,排序一下整形packagemainimport( "fmt" "sort")funcmai......
  • aijs 对象排序
    1.字典对象functiondictGetValue(value){for(dictGetValueIndexinvalue)returnvalue[dictGetValueIndex]}functiondictGetKey(value){for(dictGetKeyInd......
  • java 排序
    ......
  • [快速学]C/C++编译器
    编译器谁维护平台版权VisualC++Microsofthttps://visualstudio.microsoft.com/MicrosoftWindows有免费版GCCCGNUhttps://www.gnu.org/多平台GP......
  • C++ traits 萃取的一些简单理解
    摘取自<effectivec++>  ......
  • 希尔排序
    希尔排序希尔排序是希尔(DonaldShell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排......
  • 排序看这一篇就够了
    排序看这一篇就够了文章目录一、​​冒泡排序​​二、选择排序三、插入排序四、希尔排序五、快速排序六、归并排序七、基数排序/桶排序稳定:如果a原本在b前面,而a=......
  • 排序算法之插入排序
    思路:将数组的第一个元素作为有序数组,其余的作为无序数组,从无序数组中取一个跟有序数组比较,将其放在合适的位置。那么有序数组就有两个元素,无序数组就减少一个元素。 ......
  • ua5.4源码剖析:三. C++与Lua相互调用
    概述从本质上来看,其实说是不存在所谓的C++与lua的相互调用。lua是运行在C上的,简单来说lua的代码会被编译成字节码在被C语言的语法运行。在C++调用lua时,其实是解释运行lua......
  • 多种数组排序方法
    1.随机生成数据vara=(function(){vara=[];functionrandomInt(from,to){returnparseInt(Math.random()*(to-from+1)+from);}for......