一些基本排序算法的实现

Lua实现基本的排序算法 洗牌算法 function randomSort(nums) local n=#nums for i=1,n do local k=math.random(1,n) nums[i],nums[k]=nums[k],nums[i] end end 选择排序 function selectSort(numbers) local n=#numbers for i=1,n d... 阅读详情

花了点时间一次性实现了9个基本排序算法,

其中包括:

【冒泡排序】,【直接选择排序】,【直接插入排序】,

【希尔排序】,【折半插入排序】,【快速排序】,

【堆排序】,【锦标赛排序】,【归并排序】。


储存方式是用数组,元素可以是支持重载运算符的自定义类型,

有在数组中直接复制元素的,也有在中间过程中用索引数组记录

索引序列的,但最终结果都保存在原数组中,

好了,废话不多说了,直接上源代码!


//Sort.h

/*------------------------------------
【描述】:一些排序算法(Sort.h)
 Created by Beyond ray, 2015.1
-------------------------------------*/
#ifndef H_SORT
#define H_SORT

#include <cassert>
#include <functional>
#include "WinnerTree.h"

/*
=================================
 以下算法排序皆为从小到大
=================================
*/

//-------------------------------
// Desc:交换元素
//-------------------------------
template<typename T>
void Swap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

//------------------------------
// Desc:冒泡排序,O(n^2)
//------------------------------
template<typename T>
void BubbleSort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	bool bChanged = false;
	for (int i = left; i < right; i++)
	{
		bChanged = false;
		for (int j = right; j >=i+1; j--)
		{
			if (arr[j] < arr[j - 1])
			{
				Swap(arr[j], arr[j - 1]);
				bChanged = true;
			}
		}
		if (!bChanged)break;
	}
}

//-------------------------------
// Desc:直接选择排序,O(n^2)
//-------------------------------
template<typename T>
void ChooseSort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	for (int i = left; i < right; i++)
	{
		int minIndex = i;
		for (int j = i + 1; j <= right; j++)
		{
			if (arr[j] < arr[minIndex])
			{
				minIndex = j;
			}
		}
		if (minIndex != i)Swap(arr[minIndex], arr[i]);
	}
}

//--------------------------------
// Desc:直接插入排序,O(n^2)
//--------------------------------
template<typename T>
void InsertSort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	for (int i = left + 1; i <= right; i++)
	{
		for (int j = left; j <= i-1; j++)
		{
			if (arr[i] < arr[j])
			{
				auto insertEle = arr[i];
				for (int k = i; k >= j + 1; k--)
				{
					arr[k] = arr[k - 1];
				}
				arr[j] = insertEle;
				break;
			}
		}
	}
}

//-------------------------------------------
// Desc:希尔排序,O(nlogn)
//-------------------------------------------
template<typename T>
void ShellSort(T arr[], int left, int right, std::function<int(int)>& gapFunc)
{
	assert(left >= 0 && right >= left);
	int gap = right - left + 1;
	while (gap != 1)
	{
		gap = gapFunc(gap);
		for (int i = left; i <= right - gap; i++)
		{
			for(int j = i; j >= left;j-= gap)
			{
				if(arr[j] > arr[j + gap])
					Swap(arr[j], arr[j + gap]);
				else
					break;
			}
		}
	}
}
//--------------------------------------------
// Desc:折半插入排序,O(nlogn)
//--------------------------------------------
template<typename T>
void BinaryInsertSort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	for (int i = left + 1; i <= right; i++)
	{
		int iLeft = left, iRight = i - 1, iCenter;
		while (iLeft <= iRight)
		{
			iCenter = (iLeft + iRight) / 2;
			if (arr[i] < arr[iCenter])iRight = iCenter - 1;
			else if (arr[i] > arr[iCenter])iLeft = iCenter + 1;
			else break;
		}
		//iLeft记录的位置为插入位置
		if (iLeft <= iRight)iLeft = iCenter + 1;

		//往后移动数据
		auto insertEle = arr[i];
		for (int j = i; j >= iLeft + 1; j--)
		{
			arr[j] = arr[j - 1];
		}
		arr[iLeft] = insertEle;
	}
}
//------------------------------------------------
// Desc:left,right,center按Min,Max,Mid排列
//------------------------------------------------
template<typename T>
T& ThreeSort_MinMaxMid(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	int iCenter = (left + right) / 2;
	int minIdx = left;
	//记录最小数索引并交换到最左边
	if (arr[iCenter] < arr[left])minIdx = iCenter;
	if (arr[right] < arr[minIdx])minIdx = right;
	if (minIdx != left)Swap(arr[left], arr[minIdx]);
	//将中间值交换到右边
	if (iCenter != right && arr[iCenter] < arr[right])
		Swap(arr[iCenter], arr[right]);
	return arr[right];
}

//--------------------------------------------
// Desc:一次快速排序的分区排序
//--------------------------------------------
template<typename T>
int Partition(T arr[], int left, int right)
{
	T&Pivot = ThreeSort_MinMaxMid(arr, left, right);
	int iLeft = left, iRight= right-1;
	if (iLeft > iRight)return iLeft;
	while (1)
	{
		while (arr[iLeft] <= Pivot) iLeft++;
		while (arr[iRight] >= Pivot)iRight--;
		if (iLeft > iRight)break;
		Swap(arr[iLeft], arr[iRight]);
	}
	//将基准交换到中间
	Swap(arr[iLeft], Pivot);
	return iLeft;
}
//--------------------------------------------
// Desc:快速排序,O(nlogn)
//--------------------------------------------
template<typename T>
void QuickSort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	int ipivot = Partition(arr, left, right);
	if(ipivot-1 > left)QuickSort(arr, left, ipivot - 1);
	if(ipivot+1 < right)QuickSort(arr, ipivot + 1, right);
}

//--------------------------------------------
// Desc:向下过滤
//--------------------------------------------
template<typename T>
T& SiftDown(T arr[], int minIdx, int maxIdx)
{
	int iFather = minIdx;
	int iLChild = 2 * iFather + 1;
	int iRChild = 2 * iFather + 2;
	int imaxEleIdx;
	while (iLChild <= maxIdx)
	{
		//取两个子元素中小者
		if (iRChild <= maxIdx && arr[iRChild] > arr[iLChild])
			imaxEleIdx = iRChild;
		else
			imaxEleIdx = iLChild;
		if (arr[iFather] < arr[imaxEleIdx])
		{
			Swap(arr[iFather], arr[imaxEleIdx]);
			iFather = imaxEleIdx;
			iLChild = 2 * iFather + 1;
			iRChild = 2 * iFather + 2;
		}
		else break;
	}
	return arr[minIdx];
}
//--------------------------------------------
// Desc:堆排序,O(nlogn)
//--------------------------------------------
template<typename T>
void HeapSort(T arr[], int maxIdx)
{
	assert(maxIdx >= 0);
	//建立初始最大堆
	for (int i = (maxIdx - 1) / 2; i >= 0; i--)
	{
		SiftDown(arr, i, maxIdx);
	}
	//构造排列序列
	for (int i = maxIdx; i > 0; i--)
	{
		Swap(arr[0], arr[i]);
		SiftDown(arr, 0, i - 1);
	}
}

/*
==============================================
 以下排序算法特别考虑了自定义数据类型的比较,
 为缩短平均时间,故用索引方式记录,
 最后将最终结果复制回数组。
==============================================
*/

//------------------------------------------
// Desc:以索引排序数组对原排序数组再构造
//------------------------------------------
template<typename T>
void idxSort_Make(T arr[], int sortIdxArr[], int maxIdx)
{
	assert(maxIdx >= 0);
	//【原数组循环赋值构造排序序列】
	T temp; //复制时只花费了一个T额外空间
	int i = maxIdx, tempIdx,lastSortIdx;
	bool bCircle = false;
	while (i > -1) 
	{
		if (i != sortIdxArr[i] && sortIdxArr[i]!=-1) //数组中该元素有变化
		{
			//第一次到循环点,记录该位置所在值和索引号
			if (!bCircle) 
			{
				temp = arr[i], tempIdx = i;  
				bCircle = true; //在循环中
			}
			//循环未结束
			if (sortIdxArr[i] != tempIdx) 
			{
				arr[i] = arr[sortIdxArr[i]];
				lastSortIdx = sortIdxArr[i]; sortIdxArr[i] = -1; i = lastSortIdx;
			}
			else //循环结束交界
			{
				arr[i] = temp;
				bCircle = false;
				sortIdxArr[i] = -1;
				i = tempIdx;
				while (i > 0 && sortIdxArr[--i] == -1);
			}			
		}
		else //该位置元素与排序后不变
		{
			sortIdxArr[i--] = -1;
		}
	}
}

//------------------------------------------
// Desc:锦标赛排序,O(nlogn)
//------------------------------------------
template<typename T>
void TournamentSort(T arr[], int maxIdx)
{
	assert(maxIdx >= 0);
	int* sortIdxArr = new int[maxIdx + 1];
	if (sortIdxArr == nullptr)
	{ 
		cerr << "TournamentSort:索引数组内存分配失败!"; exit(1);
	}
	WinnerTree<T> wTree(maxIdx + 1);
	sortIdxArr[0] = wTree.init(arr);
	for (int i = 1; i <= maxIdx; i++)
	{
		sortIdxArr[i] = wTree.getNewWinner();
	}
	//数组重构及清理
	idxSort_Make(arr, sortIdxArr, maxIdx);
	delete []sortIdxArr; 
}

//------------------------------------------
// Desc:合并两个子序列
//------------------------------------------
template<typename T>
void TwoMerge(T arr[], int srcIdx[], int destIdx[], int left, int center, int right)
{
	int iSrc1Left = left, iSrc2Left = center + 1,iPos = left;
	//比较并复制小者的索引号到索引数组对应位置
	while (iSrc1Left <= center && iSrc2Left <= right)
		destIdx[iPos++] = arr[srcIdx[iSrc1Left]] <= arr[srcIdx[iSrc2Left]]?srcIdx[iSrc1Left++]:srcIdx[iSrc2Left++];
	//复制剩余索引号
	while (iSrc1Left <= center)destIdx[iPos++] = srcIdx[iSrc1Left++];
	while (iSrc2Left <= right)destIdx[iPos++] = srcIdx[iSrc2Left++];
}

//------------------------------------------
// Desc:二路归并排序,O(nlogn)
//------------------------------------------
template<typename T>
void TwoMerge_Sort(T arr[], int left, int right)
{
	assert(left >= 0 && right >= left);
	//--------------------------
	// 【索引数组分配及初始化】
	//--------------------------
	//分配两个索引数组
	int ilen = right - left + 1;
	int* sortIdx1 = new int[ilen];
	if (sortIdx1 == nullptr){ cerr << "Merget_Sort:索引数组1内存分配失败"; exit(1); }
	int* sortIdx2 = new int[ilen];
	if (sortIdx2 == nullptr){ cerr << "Merget_Sort:索引数组2内存分配失败"; exit(1); }
	//对索引数组初始化
	for (int i = 0, j = left; i < ilen; i++, j++)
	{
		sortIdx1[i] = j;
		sortIdx2[i] = j;
	}
	//--------------------------
	// 【索引交替归并记录】
	//--------------------------
	int k = 1, mid, end; //步长k:1,2,4,8,....	
	bool bIdx1To2 = true; 
	int iLOffset = 0, iROffset = right - left;
	while (k < ilen)
	{
		for (int beg = iLOffset; beg < iROffset; beg = end + 1)
		{
			mid = beg + k - 1;
			end = mid + k;
			if (mid <iROffset && end > iROffset)end = iROffset;
			if (mid < iROffset)
			{
				if (bIdx1To2)
					TwoMerge(arr, sortIdx1, sortIdx2, beg, mid, end);
				else
					TwoMerge(arr, sortIdx2, sortIdx1, beg, mid, end);
			}
		}
		//数组索引复制反转
		bIdx1To2 = !bIdx1To2;
		k = 2 * k;
	}
	//-----------------------------
	// 【数组重构及索引数组清理】
	//-----------------------------
	bIdx1To2 ? idxSort_Make(arr, sortIdx1, iROffset) : idxSort_Make(arr, sortIdx2, iROffset);
	delete []sortIdx1;
	delete []sortIdx2;
}

#endif


//WinnerTree.h

/*---------------------------------------
【描述】:排序使用的胜者树(WinnerTree.h)
 Created by Beyond ray, 2015.1
 ----------------------------------------*/

#ifndef H_WINNER_TREE
#define H_WINNER_TREE

template<typename T>
class WinnerTree
{
public:
	WinnerTree(int sortNums);
	~WinnerTree();
	int init(T arr[]);          //初始化胜者树(产生第一个冠军)
	int getNewWinner();         //得到新胜者(剔除旧胜者)
	void coutWinnerTree();      //输出胜者树(调试用)
private:
	T* m_Arr;                   //指向欲排序数组 
	int* m_Winner;              //胜者树索引数组(索引-1为剔除)
	int m_SortNums;             //排序个数(比赛个数)
};


//构造函数
template<typename T>
WinnerTree<T>::WinnerTree(int sortNums) :
m_SortNums(sortNums)
{
    assert(m_SortNums > 0);
    m_Winner = new int[2*m_SortNums - 1];
    if (!m_Winner){ cerr << "胜者树索引数组内存分配失败"; exit(1); }
}

//析构函数
template<typename T>
WinnerTree<T>::~WinnerTree()
{
	if (m_Winner)
	{
		delete[]m_Winner;
		m_Winner = NULL;
	}
}


//-------------------------
// Desc:初始化胜者树
//-------------------------
template<typename T>
int WinnerTree<T>::init(T arr[])
{
	m_Arr = arr;
	//初始化参赛者(排序码)索引序列
	for (int i = m_SortNums - 1, j = 0; i <= 2 * m_SortNums - 2; i++, j++)
		m_Winner[i] = j;

	//构造初始化胜者树
	int iLChild = 2 * m_SortNums - 3;
	int iRChild = 2 * m_SortNums - 2;
	for (int j = m_SortNums - 2; j >= 0; j--)
	{
		if (arr[m_Winner[iLChild]] <= arr[m_Winner[iRChild]])
			m_Winner[j] = m_Winner[iLChild];
		else
			m_Winner[j] = m_Winner[iRChild];

		//移动比较索引位
		iLChild -= 2;
		iRChild -= 2;
	}
	return m_Winner[0];
}

//--------------------------------------
// Desc:输出胜者树
//--------------------------------------
template<typename T>
void WinnerTree<T>::coutWinnerTree()
{
	for (int i = 0; i < m_SortNums-1; i++)
	{
		cout << m_Arr[m_Winner[i]] << " ";
	}
	cout << endl;
}
//--------------------------------------
// Desc:选取冠军后,选取新冠军
//--------------------------------------
template<typename T>
int WinnerTree<T>::getNewWinner()
{
	//第一次重写父节点值
	int offset = m_SortNums - 1;
	int lastWinnerIdx = m_Winner[0] + offset;
	m_Winner[lastWinnerIdx] = -1;	
	int nearIdx = lastWinnerIdx % 2 == 0 ? (lastWinnerIdx - 1) : (lastWinnerIdx + 1);
	int fatherIdx = (nearIdx - 1) / 2;
	m_Winner[fatherIdx] = m_Winner[nearIdx];

	//一直遍历到根节点更新最小胜者
	while (fatherIdx != 0)
	{
		fatherIdx = (fatherIdx - 1) / 2;
		int iLChild = 2 * fatherIdx + 1;
		int iRChild = 2 * fatherIdx + 2;
		if (m_Winner[iLChild] == -1)m_Winner[fatherIdx] = m_Winner[iRChild];
		else if (m_Winner[iRChild] == -1) m_Winner[fatherIdx] = m_Winner[iLChild];
		else
		{
			if (m_Arr[m_Winner[iLChild]] <= m_Arr[m_Winner[iRChild]])
				m_Winner[fatherIdx] = m_Winner[iLChild];
			else
				m_Winner[fatherIdx] = m_Winner[iRChild];
		}
	}
	return m_Winner[0];
}
#endif

//main.cpp

/*-----------------------------------
 【Cpp文件】:main.cpp
  Created by Beyond ray,2015.1
 ----------------------------------*/
#include "Sort.h"
#include<iostream>
using namespace std;

#include<time.h>

const int ARR_NUMS = 15;
const int END_IDX = ARR_NUMS - 1;
int main(int argc, char* argv[])
{
	srand((unsigned int)time(NULL));
	int a[ARR_NUMS];
	std::function<int(int)> gapFunc = [](int gap){return (gap / 3 + 1); };
	for (int count = 0; count < 9; count++)
	{
		for (int i = 0; i <= END_IDX; i++)
		{
			a[i] = rand() % 1000;
		}
		switch (count)
		{
		case 0:	BubbleSort(a, 0,END_IDX); cout << "BubbleSort:"; break;
		case 1:	ChooseSort(a, 0, END_IDX); cout << "ChooseSort:"; break;
		case 2:	InsertSort(a, 0, END_IDX); cout << "InsertSort:"; break;
		case 3:	ShellSort(a, 0, END_IDX, gapFunc); cout << "ShellSort:"; break;
		case 4:	BinaryInsertSort(a, 0, END_IDX); cout << "BinaryInsertSort:"; break;
		case 5:	QuickSort(a, 0, END_IDX); cout << "QuickSort:"; break;
		case 6:	HeapSort(a, END_IDX); cout << "HeapSort:"; break;
		case 7:	TournamentSort(a, END_IDX); cout << "TournamentSort:"; break;
		case 8:	TwoMerge_Sort(a, 0, END_IDX); cout << "TwoMerge_Sort:"; break;
		}
		for (int i = 0; i <= END_IDX; i++)
		{
			cout << a[i] <<" ";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}



一次取随机数的运行结果:


啥?十大排序算法,来这看看-基本思想+动画演示+C语言实现 十大排序算法基本思想,动画演示及其C语言实现,不要再找了,我看了好多博客里面都是有问题的。本文代码手打,已经过测试,不涉及算法复杂度以及优化,仅供理解概念。 阅读详情

相关推荐

PHP 四种基本排序算法的代码实现

PHP 四种基本排序算法的代码实现 许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。$a

z_qifa的博客 223

几个简单的排序算法

插入排序: 工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。  #include #include using namespace std; void swap(int &,in

GinSmile的博客 830

perl实现基本的排序算法

use Data::Dumper;#插入排序sub insert_sort{    my (@arr) = @_;    my $n   = $#arr+1;    my $tmp;    my $i;    my $j;    if($n == 0 || $n == 1)    {        return "count: $n\nno need to sort.\n";    }    fo...

勤劳的小蜜蜂 1233

基本排序算法的python实现

**基本算法的python实现 1、冒泡排序 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 def bubble_sort(collection): ...

weixin_42464503的博客 868

PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39); 1. 冒泡排序 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 代码实现: <?php $arr=array(1,43,54,62,21,66,32,78,.

JineD的博客 8922

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

基本排序算法实现

一、简单选择排序   1、简单选择排序的思想是这样的:首先,找到数组中最小的元素,其次,将它和数组中的第一个元素交换位置。再次,在剩下的元素中寻找最小的元素,然后将它和数组中第二个元素交换位置,这样往复进行,知道到数组中最后一个元素的时候就变成了有序数组。   2、简单选择排序算法:对于长度为N的数组,需要N2/2次比较和N次交换。   3、下面是一次选择排序的流程:从下面的流程...

qq_40148886的博客 190

深入解析 ReDoc:从零构建高性能 API 文档的终极指南

ReDoc 是一个强大的开源工具,用于将 OpenAPI 规范转换为高质量、响应式的 API 文档。本文详细介绍了如何使用 ReDoc 构建和自定义 API 文档,包括如何编写支持 OpenAPI 的 API 注解、配置 HTML 页面以加载文档,以及如何利用 ReDoc 的高级功能进行定制。通过实例代码,您将学会如何灵活地展示 API 文档,提升用户体验。无论是初学者还是经验丰富的开发者,都能从本文中获得实用的技巧与方案,帮助快速搭建符合需求的 API 文档界面。

楠搏万的博客 4628

基本排序算法的JavaScript实现

最近,复习了一下基本的排序算法,以前在校使用C语言实现的,现在由于自己做的是前端开发,所以就动手使用JavaScript实现了一些基本排序算法。

Herbert的专栏 466

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1684

海康视觉相机驱动软件MVS参数配置全攻略(附接线图+避坑指南)

本文提供了海康视觉相机驱动软件MVS从硬件连接到软件参数配置的完整指南。详细解析了供电与通讯线缆的区分、PNP/NPN信号逻辑的接线避坑方法,并重点阐述了MVS软件中触发模式、网络IP配置、图像采集及光源控制等核心参数的设置技巧,旨在帮助用户快速完成相机调试,实现稳定高效的图像采集。

weixin_29204205的博客 400

day08 Java实现七大基本排序算法

推荐博文: 点击一下 直接插入排序 希尔排序,参考:https://blog.youkuaiyun.com/qq_16697387/article/details/78136459 冒泡排序,参考视频:https://www.bilibili.com/video/av50807665 快速排序:参考视频:https://www.bilibili.com/video/av39519566?from=search...

qq_31842777的博客 393

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 684

Java 数据结构篇-深入了解排序算法(动态图 + 实现七种基本排序算法)

排序是指将一组记录按照其中的一个或多个关键字的大小,以递增或递减的顺序进行排列的过程。换句话说,排序的目标是通过某种算法处理,使得数据集中的元素根据特定的标准有序化。例如,在一个数字列表中,可以通过排序使其按数值从小到大(升序)或者从大到小(降序)排列;对于包含复杂对象的集合,则可以根据对象的某个属性进行排序。在讨论排序算法时,“稳定性”是一个重要的概念。如果在一个待排序的记录序列中存在多个具有相同关键字的记录,那么一个排序算法被称为稳定的,当且仅当这些记录在排序前后的相对次序保持不变。

m0_74750751的博客 2571

Ubuntu双系统引导修复实战:boot-repair工具详解

本文详细介绍了使用boot-repair工具修复Ubuntu双系统引导丢失问题的实战方法。当GRUB引导菜单因安装新系统或更新而损坏时,通过制作Ubuntu启动盘进入Live环境,安装并运行boot-repair,可一键完成系统修复引导,自动化执行GRUB重装与配置,解决无法进入Windows或Ubuntu的常见故障。

weixin_29224589的博客 357

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 385

js实现基本排序算法

js排序算法

weixin_45904654的博客 150

高通蓝牙学习-- 关于Android 蓝牙的介绍

本文详细介绍了AOSP蓝牙架构及高通QCA芯片的蓝牙功能实现方案。主要内容包括:1)AOSP蓝牙架构在不同Android版本中的层次结构,重点分析BTHIDL层和libbt-vendor关键组件;2)QCA芯片的引导流程说明;3)两种获取libbt-vendor源码的方式(Google官方源和国内镜像源);4)针对QCA6595/6696/66x8/67x7芯片的具体实现方案,包括固件文件定义、厂商事件处理和补丁下载流程;5)蓝牙调试方法,包括logcat日志分析、HSU和Ellisys硬件跟踪技术。文章为

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 495

七大排序算法的基本原理及实现

快速掌握七大排序算法的基本原理及实现

m0_74199136的博客 1815

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基本排序算法(Java实现)

public static void bubbleSort(int [] nums) { for(int i=0; i &lt; nums.length-1; i++) { for(int j=0; j &lt; nums.length-i-1; j++) { if(nums[j] &gt; nums[j+1]) { int temp = nums[j]; ...

u010612373的博客 319

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python选择排序算法_基本排序算法的Python实现

本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序。希望大家回顾知识的时候也能从我的这篇文章得到帮助。为了防止误导读者,本文所有概念性内容均截取自对应Wiki。本篇代码在Github上更新。冒泡排序原理冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过...

weixin_39845825的博客 116

C 语言实现基本排序算法

以下代码实现了基本的排序算法,包括:二分插入排序、选择排序、冒泡排序和快速排序四种。 // Filename: sort.h // Created by lbt on 2020-9-20. // Description: head file of sort algorithm #ifndef SORT_SORT_H void InsertSort(int a[], int n); void BubbleSort(int a[], int n); void QuickSort(int a[], int l

啸铁 262

Java 实现七大基本排序算法

一、插入排序 原理: 整个区间别分为有序区间和无序区间 每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入 public static void insertSort(int[] array) { int tmp = 0; for (int i = 1; i < array.length; i++) { tmp = array[i]; int j; for (j = i-1; j >

jiangkun0331的博客 345
上一篇: Program in Lua中图算法的改进(打印所有图路径)
下一篇: Effective C++读书笔记(条款1-10)
Beyond我爱杨
博客等级 码龄13年 36粉丝 39原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值