排序算法!~

原创 2015年07月08日 09:45:30

排序算法很多,这里主要列出几个比较经典的排序算法。

最开始我们最先接触到的排序算法是冒泡排序,冒泡排序是一种比较简单的排序算法,重复的扫描排序过的数组,直到没有数字交换的情况。时间复杂度O(n^2)。

冒泡排序:

void Bullesort(int a[], int n)
{
	int i, j, temp;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n - 1; j++)
		{
			if(a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}

选择排序也是比较简单的排序算法,简单来讲,就是找到最小的数或最大的数放在第一位,以此类推。时间复杂度O(n^2)。

选择排序:

void SelectSort(int a[], int n)
{
	int i, j, k;
	for(i = 0; i < n - 1; i++)
	{
		k = i;
		for(j = i + 1; j < n; j++)
			if(a[k] > a[j])
				k = j;
		if(k != i)
		{
			a[k] = a[k] ^ a[i];
			a[i] = a[i] ^ a[k];
			a[k] = a[k] ^ a[i];
		}
	}
}

插入排序,也是一种简单的排序方法,简单来说,就是将要排序的数组按大小插入到已经排序好的数组中。时间复杂度O(n^2)。

void InertSort(int a[], int n)
{
	int i, j;
	for(i = 2; i <= n; i++)
	{
		if(a[i] < a[i - 1])
		{
			a[0] = a[i];
			a[i] = a[i - 1];
			for(j = i - 1; a[0] < a[j]; j--)
				a[j + 1] = a[j];
			a[j + 1] = a[0];
		}
	}
}

快速排序,一种较为高效的排序方法,简单来说,就是选择一个标志,将大于这个标志的数放在右边,小于的放在左边,然后递归左右两个区间,知道区间只有一个数。时间复杂度为O(n*logn)。

void quicksort(int a[], int n)
{
	int i = 0, j = n - 1, val = a[0];
	if(n > 1)
	{
		while(i < j)
		{
			for(; j > i; j--)
				if(a[j] < val)
				{
					a[i++] = a[j];
					break;
				}
			for(; i < j; i++)
				if(a[i] > val)
				{
					a[j--] = a[i];
					break;
				}
		}
		a[i] = val;
		quicksort(a, i);
		quicksort(a + i + 1, n - i - 1);
	}
}

归并排序,也是比较高效的排序方法,简单来说,就是将数组递归分成两个小区间,然后再来合并区间,合并过程中,将区间变成有序。时间复杂度为O(n*logn)。n比较小的时候,归并排序比快排要快,但是n如果很大的话,快排就体现出了优势。

void MergeSort(int a[], int first, int end)
{
	void Sort(int a[], int first, int mid, int end);
	int mid;
	if(first < end)
	{
		mid = (first + end) / 2;
		MergeSort(a, first, mid);
		MergeSort(a, mid + 1, end);
		Sort(a, first, mid, end);
	}
}
void Sort(int a[], int first, int mid, int end)  //合并的函数
{
	int i, j, k, temp[10];
	i = first; j = mid + 1; k = first;
	while(i <= mid && j <= end)
	{
		if(a[i] > a[j])
		{
			temp[k++] = a[j++];
		}
		else
		{
			temp[k++] = a[i++];
		}
	}
	while(i <= mid)
	{
		temp[k++] = a[i++];
	}
	while(j <= end)
	{
		temp[k++] = a[j++];
	}
	for(i = first; i <= end; i++)
		a[i] = temp[i];
}




版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

排序算法--排序算法汇总

排序算法无疑是学习数据结构中的重点内容,本文将给出排序算法的汇总。 下面是具体的实现: #include #include #include #define N 1000000 int Arr...

Java排序算法---->桶排序算法

一,桶排序算法(bucket sort) 1,基本思想 桶排序的基本思想是将一个数据表分割成许多个bucket(桶),然后每个bucket可以各自排序(可以采用不同的排序算法)。它是典...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

算法 排序算法之堆排序

package SortArith; /** * 堆排序 构建最大堆,堆顶即为最大元素,每次取出最大元素后,再重新构建堆,这样再拿出次大值,循环往返 * 注意:构建堆时需要调整每个非叶子节点,...

算法-排序算法-插入排序

理解插入排序的时候,一个通俗的形容方式是整理扑克牌。在整理扑克牌的时候,手里握着的牌通常是按照A2345~JQK的有序顺序排列好的,然后每次你抽到一张新的扑克牌,就会把它放到牌组里,让插入后的牌组同样...

【排序算法】排序算法大全

排序算法在算法里面算是最常见的算法,包括常见的冒泡算法,双向冒泡算法,

【排序算法】——冒泡排序算法

前提  对还不算入门的小白,关于算法这一部分更是理解甚少,只是记得老师曾讲过用三角形表示冒泡排序算法方法,面对那个三角形更是迷迷糊糊的样子,真是迷惑了好久,最近看关于泛型内容讲解的知识刚好遇到这一部分...

几种排序算法(冒泡排序算法,选择排序算法,快速排序算法,插入排序)

#import void quick_sort(int s[], int l, int r); void InsertSort(int a[], int n); int main(int argc,...

排序算法-堆排序

堆排序(Heap Sort) 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。 堆排序的基本思想是...

排序算法——堆排序

思想 堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。 堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大...

排序算法-桶排序

桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)