数据结构及简单算法的总结----之【排序】

【数据结构】常见七大排序总结 常见七大排序概念算法总结 阅读详情

 

为了找工作,把这些玩意好好复习,多多总结下基础知识吧,有些算法是直接从别的网站copy过来,我会附加上地址。

 

稳定排序与非稳定排序:

稳定排序即在排序之后,具有相同关键码的元素位置相对不变。反之为非稳定排序。

 

 

一,排序

1.冒泡排序

基本思想:将被排序的数组垂直排成一列,从上到下扫描数组,根据待比较的数组元素的“轻重”,对相邻的元素,遵循“轻”者上浮,“重”者下沉的原则。一遍扫描过后,最重的元素已在最下面。再对前n-1个元素进行同样的操作,如此反复知道最后任何两个元素都满足轻者在上重者在下。

另外还有冒泡排序的改进,双向冒泡排序,同时进行轻的上浮和重的下沉操作。

// 更简单的方法,两层for循环,主要就是交换相邻元素
void Interview::bubbleSort(int array[], int n)
{
	for (int i = 0; i < n; ++i)
	{
		for (int j = 1; j < n - i; ++j)
		{
			if (array[j - 1] > array[j])
			{
				std::swap(array[j - 1], array[j]);
			}
		}
	}
}
void Bubble(DATA array[], int n)
//bubble sort冒泡排序
{
	int permutation = 1;   //permutation 意为排序
	int k = n - 1, j;
	DATA tmp;
	while ((k >= 1) && (permutation == 1)){
		permutation = 0;
		for (j = 0; j < k; j++)
		{
			if (array[j].ID>array[j + 1].ID)
			{
				tmp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = tmp;
				permutation = 1;
			}
		}
		k = k - 1;
	}
}


2.快速排序(不稳定)

 

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 

#include<iostream>

using namespace std;

void Qsort(int a[], int low, int high)
//递归的qsort
{
	// 递归出口
	if (low >= high)
		return;

	int first = low;
	int last = high;
	int key = a[first]; // 选取数组的第一个作为标志

	// 比key小的放在key的左边,比key大的放在key的右边
	while (first < last)
	{
		// 从数组后面向前找,找到一个比key小的值,和first交换
		while (first < last && a[last] >= key)
			--last;
		a[first] = a[last];

		// 从数组first位置向last位置找,找到一个比key大的值,和last交换
		while (first < last && a[first] <= key)
			++first;
		a[last] = a[first];
	}

	// 此时,first位置为分界线,左边都是比key小的,右边都是比key大的
	a[first] = key;

	//std::cout << first << " " << last << std::endl;
	// 递归处理 first左边,和first右边。此时first == last
	Qsort(a, low, first - 1);
	Qsort(a, last + 1, high);
}

int main()
{
	//主函数调用qsort
	int a[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24 };

	Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存泄露*/

	for (int i = 0; i<sizeof(a) / sizeof(a[0]); i++)
	{
		cout << a[i] << "";
	}

	return(0);
}/*参考数据结构p274(清华大学出版社,严蔚敏)*/

 

非递归算法:

 

//非递归算法
//数据规模很大时,递归的算法很容易导致栈溢出,改为非递归,模拟栈操作,最大长度为n,每次压栈时先压长度较大的,此时栈深度为logn。
#include <iostream>
using namespace std;

int partition(int *a, int l, int h)
{
	int x = a[l];
	int i = l;
	int j = h+1;
	int temp;
	
	while (i<j)
	{
		while (a[++i]<x&&i<h);
		while(a[--j]>x);
		
		if (i<j)
		{
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
	}
	
	a[l] = a[j];
	a[j] = x;

	return j;
}

void qsort(int *a, int l, int h)
{
	if (l>=h)
		return;

	int *s = new int[h-l+1];
	int p = 0;
	s[p++] = l;
	s[p++] = h;

	int low,high,q;

	while (p>0)
	{
		high = s[--p];
		low = s[--p];
		if (low>=high)
			break;
	
		q = partition(a, low, high);
 
		if (q-low > high-q)
		{
			s[p++] = low;
			s[p++] = q-1;

			if (high > q)
			{
				s[p++] = q+1;
				s[p++] = high;
			}

		}
		else
		{
			s[p++] = q+1;
			s[p++] = high;
			if (q > low)
			{
				s[p++] = low;
				s[p++] = q-1;
			}
		}
	}
	delete []s;
}

int main()
{
	int a[9] = {9,8,7,6,5,4,3,2,1};
	//int a[9] = {1,2,3,4,5,6,7,8,9};
	qsort(a,0,8);
	 
	for (int i=0; i<9; i++)
		cout<<a[i]<<endl;

	return 0;
}

 

qsort()函数:

 

编译器函数库自带的快速排序函数,在头文件stdlib.h中,函数原型为  

 

void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

 

参数: 1 待排序数组首地址

2 数组中待排序元素数量

3 各元素的占用空间大小

4 指向函数的指针,用于确定排序的顺序

 

 

比较函数的名称由用户自己定义,比如comp,定义函数原型为:int comp(const void * , const void *);      函数返回值必须是int,两个参数的类型必须都是const void *类型。由于通过这两个参数传递金龙的参数是无类型的,必须再函数体内要对着两个参数进行强制类型转换,才能得到正确的返回值。不同的类型有不同的处理方法。  假设对数组进行升序排序,需说明,如果两个参数的key相等,则返回0;如果前者key小于后者key值,那么返回负数,否则返回正数。对降序的处理方法类似。

例:

 

以下的比较函数可直接用于对整型数组的排序

 

int comp(const void *a,const void *b)
{
	return *(int *) a - *(int  *)b ;
}

调用形式:

 

qsort(a,100,sizeof(int),comp);

 

3.选择排序

基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

#include<iostream>
#include<time.h>
#include<iomanip>
using namespace std;
const int N = 10;
int main()
{
	int a[N], i, j, temp, b;
	srand(time(NULL));
	for (i = 0; i<N; i++)
		a[i] = rand() % 100;
	for (i = 0; i<N; i++)
		cout << setw(3) << a[i];
	/*
	setw()设置域宽
	比如:
	cout<<setw(5)<<12345<<endl;
	就输出
	12345
	cout<<setw(6)<<12345<<endl;
	输出
	空格+12345

	===详细见iomanip:http://baike.baidu.com/view/1655215.htm?fr=aladdin
	*/
	cout << endl;
	for (i = 0; i<N - 1; i++)
	{
		temp = i;
		for (j = i + 1; j<N; j++)
		{
			if (a[temp]>a[j])temp = j;
		}
		if (i != temp)
		{
			b = a[temp]; a[temp] = a[i]; a[i] = b;
		}
	}
	for (i = 0; i<N; i++)
		cout << setw(3) << a[i]; cout << endl;
}

 

 

 

4.插入排序

基本思想:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。

具体细分为直接插入排序,和二分法插入排序。二分法需要在选择插入位置时用二分来查找,时间复杂度为n.*logn

2014.9.12 19:54

 

//insertsort.h  
#ifndef INSERTSORT_H_
#define INSERTSORT_H_

#include <vector>
using namespace std;

class InsertSort{
private:
	int len;
	vector<int> list;
public:
	InsertSort(vector<int> _list,int _len);
	void insert_sort();
	void out();
};
#endif /* INSERTSORT_H_ */

//没主函数

#include <iostream>
#include "insertsort.h"
using namespace std;
InsertSort::InsertSort(vector <int> _list,int _len){
	for(int i=0;i<_len;i++)
		list.push_back(_list[i]);
	this->len = _len;
}

void InsertSort::insert_sort(){
	int insertNum;
	for(int i=1;i<len;i++)
	{
		insertNum = list[i];
		int j=i;
		while(j>0 && insertNum < list[j-1])
		{
			list[j] = list[j-1];
			j--;
		}
		list[j]= insertNum;
	}
}

 

 

 

 

 

5.希尔排序(后面可能有跟上面重复的排序,今天刚参考了另一本书)

不稳定排序,方法:取gap=┌gap/2┐,并以此作为间隔,讲数据分为gap个子序列,所有距离为gap的对象放在同一组,gap与2gap,gap+1与2gap+1,分隔组进行插入排序,gap--;直到gap=1;

 

6.堆排序     ( 时间复杂度O(N*logN)     不稳定排序     以下内容来自百度百科)

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。

定义:
n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点
若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:

树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
【例】关键字序列(10,15,56,25,30,70)和(70,56,30,25,15,10)分别满足堆性质(1)和(2),故它们均是堆,其对应的完全二叉树分别如小根堆示例和大根堆示例所示。


大根堆和小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。注意:①堆中任一子树亦是堆。②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆。

高度:
堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目;定义堆的高度为树根的高度。我们将看到,堆结构上的一些基本操作的运行时间至多是与树的高度成正比,为O(lgn)。

 

堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
(2)大根堆排序算法的基本操作:
① 初始化操作:将R[1..n]构造为初始堆;
② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
注意

①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止
特点

堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
区别

直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
堆排序可通过树形结构保存部分比较结果,可减少比较次数。

 

 

//array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度
//本函数功能是:根据数组array构建大根堆

void HeapAdjust(int array[],int i,int nLength)
{
	int nChild;
	int nTemp;
	for(;2*i+1<nLength;i=nChild)
	{
		//子结点的位置=2*(父结点位置)+1
		nChild=2*i+1;
		//得到子结点中较大的结点
		if(nChild < nLength-1 && array[nChild+1] > array[nChild])
			++nChild;
		//如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
		if(array[i] < array[nChild])
		{
			nTemp = array[i];
			array[i] = array[nChild];
			array[nChild] = nTemp;
		}
		else
			//否则退出循环
			break;
	}
}

//堆排序算法
void HeapSort(int array[],int length)
{
	int tmp;
	//调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
	//length/2-1是最后一个非叶节点,此处"/"为整除
	for(int i=length/2-1; i>=0; --i)
		HeapAdjust(array,i,length);
	//从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
	for(int i=length-1;i>0;--i)
	{
		//把第一个元素和当前的最后一个元素交换,
		//保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
		///Swap(&array[0],&array[i]);
		tmp = array[i];
		array[i] = array[0];
		array[0] = tmp;
		//不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
		HeapAdjust(array,0,i);
	}
}

 

 

 

 

 

 

7.归并排序

和快排一样,采用分治的策略和递归的方法,所谓的归并,就是将两个或两个以上的有序数据合并成一个新的有序的序列。

(1)两路归并

两个数组已经拍好序,然后合并为一个数组。方法就是每次在两个数组头开始找小的,然后放进一个新的数组中。

(2)归并排序

一个乱序的数组,如何用以上介绍的归并思想进行排序呢?

第一步,将数组两两分组,每对数字可以理解为两个只有一个元素的数组,然后进行一次归并。

第二步,上步是2个元素归并,第二步是2组含有2个元素的数组进行归并。

第三步,2个含有4个元素的数组进行归并。。。

。。。

知道最后两组数组归并,排序完成。(画图比较明显)

 

8.计数排序(时间复杂度为O(n))

这个排序方法相对于以上的方法有不同之处,但也不失为一种好的处理问题的方法。

计数排序有以下一些限制条件:

1.输入的线性表的元素属于有限集S.

2.输入的线性表长度有限

 

比如“有一串字母序列,请按照字典的顺序排列,字母有重复,如bbaadfakengdsj.”

根据这些条件,我们可以建立一个大小为24的数组,从a到z,分别对应数组的每一位。

然后从头到尾扫描一遍,扫描的过程中,如扫描到b,则b对应的array[2]++;

输出,从头到尾扫描刚刚保存的数组即可得到结果。

排序算法JAVA实现,eclipse+txt java排序算法 立即下载

相关推荐

Ubuntu中snap简单介绍

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理。但是由此带来的问题就是它占用更多的磁盘空间 介绍一些常用命令,有点类似docker 1、查看已经通过snap安装的snap包 snap list可以查看 2、可以搜索想要的snap包,例如tomcat snap search tomcat

icanflying的博客 4万+

数据结构中常用的排序算法总结

数据结构之排序。直接插入排序,折半插入排序,冒泡排序,快速排序等。

Reset 7555

JLink版本不兼容?手把手教你解决APM32F003F6P6在Keil中烧写闪退和报错

本文详细解析了APM32F003F6P6在Keil中烧写闪退和报错的解决方案,重点介绍了JLink版本兼容性问题。通过实测不同版本组合,推荐使用JLink 7.20a或6.86b与Keil 5.25的黄金组合,并提供详细的降级驱动和工程配置步骤,帮助开发者高效解决烧写困境。

weixin_33694620的博客 416

【数据结构】排序算法大总结

排序算法大总结

大三小白C++进阶之路 8359

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 215

PCL 直通滤波器【2026最新版】

PCL直通滤波器函数详解以及用于多字段滤波、强度滤波、获取某一时间范围内的点等高阶用法案例分享。博客长期更新,本文最近一次更新时间为:2026年3月11日。

点云侠的博客 40万+

数据结构——排序算法分析与总结

排序算法

island1314的博客 4088

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8852

数据结构排序算法总结

一、总体分类 1、简单排序 ①直接插入排序 ②简单选择排序 ③冒泡排序 2、复杂排序 ①希尔排序 ②快速排序 ③堆排序 ④归并排序 ⑤基数排序 二、算法思想概述 1.1直接插入排序 算法思想:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排关键字都被插入到有序序列中为止。 时间复杂度:O(n²) 1.2简单选择排序 算法思想:从头到尾顺序扫描序列,找出最小的一个关键字,然后和第一个关键字交换,接着从剩下的关键字中继续扫描找出最小的一

AlanTuring_hst的博客 1553

addBumpConnectTargetConstraint 命令详解

本文介绍了Cadence Innovus中用于倒装芯片设计的addBumpConnectTargetConstraint命令的核心功能和使用方法。该命令主要用于为凸点(Bump)添加连接目标约束,通过绑定实例、引脚/网络和端口号等属性,实现凸点与电源/信号网络的精准映射。文章详细解析了命令语法结构、参数说明及使用场景,包括必选参数(指定凸点方式)、分支选择(实例连接或电源连接类型)以及互斥参数(引脚名与网络名)等重要注意事项,并提供了典型应用示例。该命令特别适用于倒装芯片设计中凸点与PG网络、IO实例的连接

u013620135的博客 394

手把手教你玩转RISC-V指令集​​​专栏--​​1.2 对比x86/ARM:RISC-V的三大核心优势(开放、灵活、可扩展)​

​:RISC-V以“开放打破垄断、灵活适配场景、扩展定义未来”的三大优势,正在重塑计算架构格局。其核心价值不仅是技术革新,更是对全球半导体产业链话语权的重新分配。

amy_mhd的博客 130

【数据结构】八大排序之简单选择排序算法

数据结构基本选择排序算法之简单选择排序详解.内容包括:简单选择排序的简介及实现思路,代码实现,优化,算法的时间复杂度分析.

C/C++领域,数据结构,linux,MySQl学习者 3086

隧道裂缝检测【C++PCL】

我们团队注重每一个细节,确保代码的可读性、可维护性和可扩展性达到最高标准。我们严格遵循行业最佳实践,采用模块化和面向对象的设计原则,使得我们的代码结构清晰且易于理解。我们的点云服务更是引以为傲。我们的技术团队拥有深厚的专业知识和丰富的经验,能够提供高度准确和高效的点云处理服务。无论是点云的获取、存储还是分析,我们都能够满足客户的需求,并提供出色的解决方案。我们的技术实力也是无与伦比的,拥有广泛的技术背景和深入的专业知识。

weixin_45196569的博客 848

数据结构和算法--算法与数据结构的概述、简单排序

文章主要介绍了什么是算法、数据结构,以及细致的讲解了三个简单的排序,分别是选择排序、冒泡排序、插入排序。

m0_64005381的博客 745

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构排序算法——简单选择排序

简单选择排序 从待排序的数列中选择一个最小的数,放到有序数列的最后一位,最始的有序数列就是无序数列的第一个数,就相当于用数列的第一个元素分别与其它元素比较,选出最小数的下标,然后将最小数与有序数列的最一个数交换位置。因为每次选择的都是最小的数,所以经过排序之后,待排序数列变成有序(待排序数列中选择的最小的数实际上是有序数列中最大的数,因为比它更小的数已在上一次比较的时候被提到有序数列了)。 时...

不试一下你怎么知道自己有多强?最不像程序员的程序员的专栏 572

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java最简单排序算法_java数据结构排序算法(3)简单选择排序

这篇文章主要介绍了java数据结构与算法之简单选择排序,结合实例形式分析了选择排序的原理、实现方法与相关操作技巧,需要的朋友可以参考下本文实例讲述了java数据结构与算法之简单选择排序。分享给大家供大家参考,具体如下:在前面的文章中已经讲述了交换类的排序算法,这节中开始说说选择类的排序算法了,首先来看一下选择排序的算法思想;选择排序的基本算法思想:每一趟在 n-i+1 (i=1,2,3,……,n-...

weixin_42299066的博客 135

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数据结构排序算法演示系统_数据结构和算法-简单排序之对象排序

序言前几篇文章中我们分别介绍了JAVA数据结构和算法-简单排序之冒泡排序、JAVA数据结构和算法-简单排序之选择排序和JAVA数据结构和算法-简单排序之插入排序。在实际使用过程当中,很少会使用单一基础数据类型,更多的是应用于对象排序。本文将基于Person对象以lastname(姓)为关键字来排序。实现的算法为以上三种算法中最高效的插入排序算法。lastname关键字排序注意:下文中没有Perso...

weixin_39666931的博客 220

【数据结构与算法】简单排序(冒泡排序、选择排序、插入排序)完整思路,并用代码封装排序函数

之前的文章,我已经把前端需要了解的数据结构都给说了一边,并且我们也都对其进行了封装。现在我们要开始对排序算法部分进行讲解,排序算法顾名思义,就是对一堆杂乱无章的数据按照一定的规则将它们有序地排列在一起。 在讲解排序算法时,大致分成两大类,如下图 本文

零一的博客 2万+

数据结构排序算法之简单插入排序

  接着昨天,排序算法-》简单插入排序。   简单插入排序算法原理:从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。   在实际的算法中,我们经常选择序列的第一个元素作为有序序列(因为一个元素肯定是有序的),我们逐渐将后面的元素插入到前面的有序序列中,直到整个序列有序。 示意图如下: ...

andy2541的博客 212

数据结构——排序算法(简单篇:冒泡排序、选择排序、插入排序)

算法最好时间最坏时间稳定性空间复杂度适用场景冒泡排序O(n)O(n²)稳定O(1)数据量小,且大致有序选择排序O(n²)O(n²)不稳定O(1)数据量小,对交换次数敏感插入排序O(n)O(n²)稳定O(1)数据基本有序,小规模排序。

xcnn_的博客 1061

java 数据结构和算法_3_简单排序01

java 数据结构和算法_3_简单排序01

love2000118的专栏 120

数据结构和算法之简单选择排序

/// <summary> /// 简单选择排序 /// 给定数组:int[] arr={里面n个数据}; /// 第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换; /// 第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换; ...

weixin_30707875的博客 223

数据结构与算法之简单选择排序

数据结构与算法之简单选择排序前提条件简介简单选择排序算法完整代码输出结果 前提条件 熟悉C语言与指针 熟悉数据结构与算法 简介 简单选择排序是一种简单但不稳定的排序算法。 最好情况下,即待排序记录初始状态就已经是升序排列了,则不需要移动记录。 最坏情况下,即待排序记录初始状态是按第一条记录最大,之后的记录从大到小顺序排列,则需要移动记录的次数最多为3(n−1)3(n-1)3(n−1)。 简单选择排序过程中需要进行的比较次数与初始状态下待排序的记录序列的排列情况无关。 当i=1i=1i=1时,需进

FriendshipTang的博客 541

数据结构与算法之排序算法---简单选择排序

数据结构与算法之排序算法—简单选择排序 简单选择排序的基本思想 完整实现代码 复杂度分析 2016年10月18日15:54:57 by:piaxiaohui简单排序的基本思想 简单选择排序:先选择一个关键字,然后进行比较,找到合适的关键字再做交换,并且只移动一次。冒泡排序的思想就是不断地(相邻两个元素)交换,通过交换完成最终的排序。 简单选择排序就是每一趟在n-i+1(

u010548437的博客 3531

36.数据结构与算法-选择排序-简单选择排序,堆排序

简单选择排序 简单选择排序算法分析 堆排序 堆的定义 堆排序 需要解决的问题 堆的调整(筛选) 筛选过程的算法 堆的建立 堆排序

q1312022158的博客 152
上一篇: 判断质数 How many prime numbers
下一篇: C/C++中的sizeof相关【面试?】
eclipse_c
博客等级 码龄14年 28粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值