初探几种排序算法

多种排序算法的总结(不包括复杂度的详细推算)

稳定排序与不稳定排序

稳定排序:相同元素在排序中的相对位置不改变。

不稳定排序:相同元素在排序中的相对位置改变。

内部排序与外部排序:

内部排序:待排的记录与内容都放在计算机的随机存储器中进行的排序过程

外部排序:一般指待排序记录的数量很大,以致内存中一次不能完全容纳全部的记录,在排序过程中,需要对外存进行访问的排序过程。

排序算法的复杂度:

在此我们一般只要考虑的就是时间复杂度,当然个别排序的空间复杂度也很大,如希尔排序。这里时间复杂度的计算方法和一般复杂度计算方法类似。

按照排序的过程中所依据的不同可以分类为:

插入排序,交换排序,选择排序,归并排序,基数排序,二叉排序树排序

插入排序:

利用有序表的插入操作进行排序

有序表的插入:将一个记录插入到已经安排好的有序表中,从而得到一个新的有序表。

直接插入排序算法主要应用比较和移动两种操作。

void insertsort(int R[],int n){
	int i,j,temp;
	for(i=1;i<n;i++)
	{
		temp=R[i];
		j=i-1;
		while((j>=0)&&(temp<R[j]))
		{
			R[j+1]=r[j];
			j--;
		}
		R[j+1]=temp;//put single on first
	}</span>

希尔排序(有一种直接插入排序的改进)

方法:先将待排序列分割成为若干的子序列分别进行直接插入排序;待整个序列中的记录基本有序后,在进行一次直接插入排序。

希尔排序的时间复杂度:

O(nlog2n)和O(N平方)之间大约O(N的1.3次方)

void shellsort(int a[],int arrsize)
{
	int temp;
	int gap=arrsize/2;
	while(gap != 0){
		for(int i=gap;i<arrsize;i++){
			temp=a[i];
			for(int j=i;j>=gap;j-=gap){
				if(temp < a[j-gap])
					a[j]=a[j-gap];
				else
					break;
			}
			a[j] = temp;
		}
		gap = (int)(gap/2);
	}
}</span>

交换排序--冒泡排序

思想:通过不断比较相邻元素的大小,进行交换实现排序

void bubblesort(int a[],int n)
{
	int flag = 1;
	for(i=1;i<n;i++)
	{
		flag=0;
		for(int j=n-1;j>=i;j--)
			if(R[j]<R[j-1])
			{
				t  = R[j];
				R[j]=R[j-1];
				R[j-1]=t;
				flag=1;
			}
		if(flag==0)
			return ;
	}
}</span>

交换排序--快速排序

冒泡排序的一种改进算法

思想:以首记录作为轴记录,从前,后向扫描序列,通过交换,实现大值记录后移,小值记录前移,最终将轴记录安置在一个适当的位置(小值记录在前,大值记录在后)

轴记录将原序列分割成两个部分,依次对前后两部分重新设定轴记录,继而分别在进行快速排序。直至整个序列有序。

快速排序----分割过程

快速排序是一个分治的算法

对于一个序列,取它的一个元素作为轴,把所有小与轴的元素放在它的左边,大于它的元素放在它的右边

分割算法:

用临时变量对轴进行备份

取链噶个指针LOW 和HING ,他们的初始值就是序列的两端小表,在整个过程中保证LOW 不大于HIGH

移动两个指针

首先从HING 所知的位置向左搜索,找到第一个小与轴的元素,把这个元素放在LOW 的位置

在从LOW开始向右,找到第一个大与轴的元素,把它放在HING 的位置

重复上述过程,直到LOW=HIGH

把轴放在LOW 所指的位置

这样所有大于轴的元素北方在右边,所有小与轴的元素被放在左边。

void Fquick_sort(int *addr,int low,int high)
{
	int lowpos = low;
	int highpos= high;
	int povite = addr[low];
	if(lowpos >= highpos){
		return ;
	}
	while(lowpos < highpos){
		while((lowpos < highpos)&&(add[highpos]>=povite)){
			highpos--;
		}
		if(lowpos < highpos){
			addr[lowpos] = addr[highpos];
			lowpos++;
		}
		while((lowpos < highpos)&&(addr[lowpos]<=povite)){
			lowpos++;
		}
		if(lowpos < highpos){
			addr[highpos]=addr[lowpos];
			highpos--;
		}
	}
	addr[lowpos]=povit;
	Fquick_sort(addr,low,lowpos-1);
	Fquick_sort(addr,lowpos+1,high);
	return ;
}</span>

时间复杂度:平均O(nlog2n)

空间复杂度:O(N平方)

快速排序是一种不稳定的排序方法

简单选择排序:

每一趟都选出一个最大或最小的元素,并放在适当的位置。

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

归并排序:

思想:将两个有序的序列合并成一个有序的序列,所以如果只有两个元素,所以归并排序就是将一个序列不停拆分,直到拆成一个一个元素为止,然后再进行合并排序。

void merge(int *add,int len)
{
	int lenA = 0,lenB = 0,lenC = 0,lentmp = 0;
	int *arrC = NULL;
	if(len <= 1){
		return ;
	}
	arrC = (int *)malloc(len*sizeof(int));
	lentmp = len/2;
	merge(add,lentmp);
	merge(&add[lentmp],len-lentmp);
	lenA = 0;lenB = lentmp;
	lenC = 0;
	while((lenA != lentmp)&&(lenB != len)){
		if(add[lenA]<add[lenB]){
			arrC[lenC] = add[lenA];
			lenA++;
		}else{
			arrC[lenC] = add[lenB];
			lenB++;
		}
		lenC++;
	}
	if(lenA == lentemp){
		while(lenB < len){
			arrC[lenC++]=add[lenB++];
		}
	}else if(lenB == len){
		while(lenA < lentmp){
			arrC[lenC++]=add[lenA++];
		}
	}else{
		//printf("all ok !\n");
	memcpy(add,arrC,len*sizeof(int));
	free(arrC);</span>

时间: 2024-10-08 01:47:24

初探几种排序算法的相关文章

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

几种排序算法比较

图解数据结构(10)——排序 十四.排序(Sort) http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html <Thinking in Algorithm>12.详解十一种排序算法 http://blog.csdn.net/speedme/article/details/23021467

数据结构中的7种排序算法

数据结构中的7种排序算法 排序是将一个记录的任意序列重新排列成一个按键值有序的序列. 时间复杂度主要考虑元素的移动次数. 结构如下: 1.直接插入排序 1,定义:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好序. 2,时间复杂度:在最好情况下,待排序序列为正序,时间复杂度为O(n):最坏情况下,待排序序列为逆序,时间复杂度为O(n^2);平均情况下,时间复杂度为O(n^2). 3,空间复杂度:O(1). public static void insertSort(

总结N种排序算法及实现

排序算法是一个简单的问题,但在此问题上却有大量的研究!当前的排序算法通常按照如下四个方面进行分类(或是评价): 1.时间复杂度:一个排序算法的理想性能是O(n).一般而言,好的性能O(nlogn),坏的性能O(n2). 2.空间复杂度(内存使用量) 3.稳定性:稳定的排序算法会让原本有相等键值的记录维持原本的相对次序. 4.排序方式:插入.交换.选择.合并等 一.冒泡排序:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 步骤:1.比较相邻的两个元素,如果第一个比第二个大,就

八种排序算法(内部排序)

八种排序算法很长时间没有使用了,今天做一个总结,方便以后自己用的时候参考. 这八种排序算法都是内部算法,这八种排序算法分别是: 1. 插入排序 1)直接插入排序 2)希尔排序 2.选择排序 1)简单选择排序 2)堆排序 3.交换排序 1)冒泡排序 2)快速排序 4.归并排序 5.基数排序 一.直接插入排序 将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.在实际操作中,先将序列的第一个记录看成是一个有序的子序列,然后从第二个.第三个.……记录逐个进行插入,直至整个序列有

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

四种排序算法PHP实现类

四种排序算法的PHP实现:1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 2) 选择排序(Selection Sort)的基本思想是: 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 3) 冒泡排序的基本思想是: 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止. 4) 快速排序实质上和

经典的两种排序算法

一.冒泡排序 int temp = 0; for (int j = 1; j < a.Length; j++) { for (int i = 0; i < a.Length - j; i++)//内循环,每走一趟会把最小值放到最后 { if (a[i] < a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } } 二.选择法排序 int min; for (int j = 0; j< a.Length; j++

几种排序算法的C++实现——快速排序、堆排序、基数排序

排序算法是非常常见的面试笔试问题,考查的一个人的基本功,本文将一些排序做了C++的实现,就当是做个学习总结吧. 1.快速排序 快速排序的中心是填坑法,取一个数(这里选取第一个数)作为基准数temp,从队尾开始寻找第一个比基准数小的数a[j],交换a[j]和temp,然后队首开始查找第一个比temp大的数a[i],交换之,遍历的结果是当i>=j时,temp左边的数都小于temp,后边的数都大于temp,这个有点像归并排序.最后利用递归调用完成排序,代码如下: 1 void QuickSort(in