一些基本排序算法的实现

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

别光看手册!手把手教你用SGM2036 LDO设计一个稳定3.3V转1.8V的MCU供电电路(附PCB布局避坑指南)

本文详细介绍了如何使用SGM2036 LDO设计一个稳定的3.3V转1.8V的MCU供电电路,包括需求分析、芯片选型、外围器件计算、PCB布局避坑指南及实测验证。通过实际案例和计算示例,帮助工程师快速掌握LDO应用技巧,确保系统电源稳定可靠。

weixin_42548893的博客 505

基本排序算法实现

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

qq_40148886的博客 190

智能座舱语音测试避坑指南:从唤醒率到方言识别,这些场景你测全了吗?

本文深入解析智能座舱语音测试的关键场景与避坑指南,涵盖唤醒率测试、方言识别、多音区交互等复杂场景。通过实战案例与自动化测试方案,帮助开发者全面提升语音系统的可靠性与用户体验,特别关注环境噪声干扰与方言覆盖策略。

weixin_42613501的博客 496

基本排序算法的JavaScript实现

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

Herbert的专栏 466

国产操作系统应用迁移与适配

了解国产操作系统的背景及意义

2301_77609559的博客 2680

ETL基础概念及要求详解

ETL即Extract(抽取)Transform(转换)Load(装载)的过程,如下图,同时也包括数据清洗的部分,是数据从源端到目标端的一个数据处理的过程,是构建数据仓库的重要一环,但不局限于构建数据仓库其他BI(商业智能)的设计和开发数据分析平台也经常用到ETL。

qq_43605229的博客 8944

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

别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗?

本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。

weixin_42699679的博客 590

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

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

m0_74750751的博客 2571

java零基础从入门到精通(全)

目录前言1. 入门知识1.1 java体系1.2 JDK/JRE/JVM区别1.3 编译与运行理解1.4 类体函数细节2. 标识符 前言 java优势 健壮性(JVM(C++语言写的一个虚拟的计算机)、GC(垃圾回收机制)) 多线程并发 可移植性/跨平台 1. 入门知识 1.1 java体系 JavaSE:标准版 JavaEE:企业版 JavaME:微型版 1.2 JDK/JRE/JVM区别 JVM是不能独立安装的。 JRE和JDK都是可以独立安装的 层层嵌套,jvm包括jdk,jdk包括jre

码农研究僧的博客 6万+

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 239

js实现基本排序算法

js排序算法

weixin_45904654的博客 150

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

使用C++详细过程版实现的LevenbergMarquardt非线性最小二乘法拟合圆柱

点云侠的博客 607

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

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

m0_74199136的博客 1815

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

基本排序算法(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

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

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、付费专栏及课程。

余额充值