细数那些我们熟悉的 排序!

第一个 ,不得不说的 是 <冒泡排序>

作为 一个非常经典,又差劲的算法 。

计算过程如下:

    ->每次遍历数组,通过对比,使最大的冒上去,

->这样通过N次的轮循 ,可以使 排序的数组有序。

优点:简单,适用性强。

  缺点:慢。

  适用性:数组,链表.

  性质:稳定性排序【同样的数组,计算下来,结果一样】。

  复杂度:平均 n^2,在有序的情况下,可以 O(N) ,

代码:

//普通的
void solve(int * a , int lenght){
	int i,j;
	for(i = 0 ;i < length-1 ; ++ i){
		for(int j = 0 ; j < length - 1 - i ; ++ j ){
			if( a[j] < a[j +1] ){
                        swap(a[i],a[j]);
			}
		}
	}
}
//优化的 : 记录最后更新的位置,这样后面的就是有序的不需要在更新,
void solve(int * a , int lenght){
	int i,j;
	for(i = lenght-1 ;i >= 1 ; ++ i){
		int pos = 0;
		for( j = 0 ; j < i ; j++){
			if(a[j] <a [j+1]){
				swap(a[i],a[j])
				pos = j;
			}
		}
		i = pos;
	}
}

 二:归并排序:

   前言:归并排序,是利用分治的思想,

也就是说 将一个大问题化为一些小问题,这样在解决小问题的情况下,

在通过,合并操作,使以解决的小问题称以解决的大问题。

计算过程如下:

    ->将一个数组递归的分解成俩断->四段->八段->直到分解称只有一个元素

->在一个元素的情况下,这断可以认为是有序的,进而满足解决了这个小问题

    ->对于合并,对于俩段有序的数组,只要在每个数组上打一个index每次取最小的那个元素不,知道元素取完毕就好。

优点:稳定,效率一般(不断的SWAP)

  缺点:需要额外的内存。

  适用性:数组,链表(需要预先处理出分段,麻烦,一般可以认为不支持).

  性质:稳定性排序【同样的数组,计算下来,结果一样】。

  复杂度:平均 n*log(n)。

  代码:

三:堆排序:

  堆排序,人如其名,利用堆来排序,原理有些类似于冒泡排序,都是每次找出最大值。

  盗图->

  简要的说一下堆,一般的堆都是指 二叉堆,也就是,上图是一个小顶堆,也就是说,父亲节点的元素值比他的儿子节点的元素的值都小。

  数组有一个很好的性质

    对于  position = i 的元素 他的左儿子 可以表示为 i<<1(i*2) ,右儿子可以表示为i<<1|1 (i*2+1)

  也正是因此堆可以用老模拟数组的排序过程

  过程:

    1.数组作为堆初始化成为大顶堆。这样堆顶元素是最大的

    2.把堆顶元素的值和最后一个位置元素的值做一个交换,同时堆的大小减一。 ->这样这个值,是所有元素中最大的且已经在最后面了。

    3.上边的操作就如同 删除堆顶元素的操作,只不过把堆顶元素放到了最后。

    4.删除堆顶元素后进行更新操作,递归向下,保持堆的性质

    5.重复2到4的操作,直到堆内没有元素。

优点:稳定,效率一般(不断的SWAP)。

   缺点:稳定,同时中用,比归并排序要快(个人见解)。

  适用性:数组,(链表不支持吧?)

  性质:非稳定性排序【同样的数组,计算下来,结果可能不一样】。

  复杂度:平均 n*log(n)。

四:快速排序:

  快排,为什么叫快排?因为他快, 这个排序,也算是分治的思想,

  和归并的相反,先计算在递归分解,  而归并是先递归分解,在合并。

  过程,

    1.在这断内选取出一个关键的key值,同时指定俩个指针(就是位置表示符号)一个起始,一个结束(这里先认为取左侧第一个,不是的可以,用swap来达到这个状态)

    2.先从左开始比较,如果都比他小OK左侧的指针右移,否则把这个元素的值丢给右侧指针(不用担心左侧这个值怎么办,提示:提取出来的KEY),然后从右边开始扫描(向左侧)

    3.同上,知道扫描到一个比这个小的OK在此交换俩个指针指向的元素。在此从左侧的指针开始扫描

    4.重复2,3直到俩个指针指向同一个位置,OK,本次扫描结束

    5.这样连个指针只想的位置赋值为KEY那么左侧都比他小, 右侧都比她大,

    6.数据根据指针的位置,查分为俩段 利用1-4这个过程,求解即可。

代码:

int quicksort(int[] v, int left, int right){
        if(left < right){
                int key = v[left];
                int low = left;
                int high = right;
                while(low < high){
                        while(low < high && v[high] > key)high--;
                        v[low] = v[high];
                        while(low < high && v[low] < key) low++;
                        v[high] = v[low];
                }
                v[low] = key;
                quicksort(v,left,low-1);
                quicksort(v,low+1,right);
        }
}

  

优点:内存无额外消耗,平均而言了认为是最好的排序算法。

性质,非稳定性排序。

复杂度n* logn

适用性,数组,链表。

有些代码我没写(想要写给你,夜深了)

时间: 2024-12-06 20:32:46

细数那些我们熟悉的 排序!的相关文章

【转帖】鸿蒙发布,老兵戴辉为你细数一部华为操作系统28年史

鸿蒙发布,老兵戴辉为你细数一部华为操作系统28年史 https://www.ijiwei.com/html/news/newsdetail?source=pc&news_id=725007 爱集微·08-10 12:31·数码 来源: 上观新闻 一部华为发展史,也是一部可歌可泣的操作系统发展史. 8月9日,东莞松山湖沸腾的一天,华为消费者业务CEO余承东发布了鸿蒙操作系统,中文来自山海经,英文叫HarmonyOS,不是以前传说的OakOS. 余承东在介绍鸿蒙OS开发初衷时表示:“随着全场景智慧时

细数2014年成长

冬天的来临,让我的心很冷,不想动,不想思考,不想说话,今年剩下的一些日子,我想也就这样了,不会再有什么变化了.打开文档,开始记录今年,展望明年.记录是为了抛弃过去一切,又想未来某天还能拾起,所以把它尘封在笔记里.之后就可让脑中的一切随风消散,没有任何思想负担,放空的心就能接纳更多新的内容. 细数2014年的成长  成长主要在意识形态上,至于技术,越来越难静下心来学了. 1.彻底离弃网络游戏 放弃网络游戏,开始把人生当做游戏.这个游戏只有一次机会,不能死,不能走错路,每一次选择都要经过深思熟虑.和

细数人体器官仿生,还有哪些可开发的

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 人体器官列表(后续'借'张人体图过来 -- 读书人的事情,不能叫偷,叫窃,谐个音,就叫借了) 1.眼:摄像头: 2.耳:mic: 3.口:音箱或耳

细数AutoLayout以来UIView和UIViewController新增的相关API&lt;转写&gt;

细数AutoLayout以来UIView和UIViewController新增的相关API – UIViewController篇 UILayoutSupport @property(nonatomic,readonly,retain) id<UILayoutSupport> topLayoutGuide NS_AVAILABLE_IOS(7_0); @property(nonatomic,readonly,retain) id<UILayoutSupport> bottomLay

再回首:细数存储设备的前世今生-转

我们如何迎头赶上? 据IDC统计,今年全球数据总量将达到2.16ZB,预计将在2016年增长到3.77ZB.随着数据量的不断增长,对数据存储的要求也越来越高,不过无须担心,相关的存储技术也已经迎头赶上. 数据存储技术是发展最快的电子技术.磁带,硬盘和固态硬盘的容量大约以每12到18个月就会增加一倍. 如今的台式机硬盘容量已经高达4TB~5TB.这足以装下1万张照片或562小时的高清视频.希捷表示,到2020年热辅助磁记录技术(HAMR)会带来60TB硬盘,这一容量足以存储12万张照片或6750小

细数空格缩进在开发中的坑

没错,这是一篇火药文.网上流传的各种编程规范几乎青一色都是说用空格代替Tab,其理由几乎都是“这是唯一能保证在所有环境下获得一致展现的方法”. 那我想问一句,你们到底能要多少种环境要看代码??? 1.用Windows自带的记事本?那我只能说,你继续装,看你什么时候才能完成得了任务.2.连接到Linux服务器上使用VI或者VIM?我也只能说只有改服务器的配置文件的时候才会这样做吧,而且如果是配置文件比较复杂也是下载下来用Notepad++改清晰很多好伐,比如Aapche的配置文件在Notepad+

年华细数 谁的幸福不知归途

年华细数  谁的幸福不知归途 文   沫子也 他今年大一,他喜欢她. 有别于一见钟情,他对她的喜欢更趋向于百转千回,这个时候的她,刚和男朋友分手,念大二.之所以说百转千回,还因为后来一起吃饭的时候,她问他彼此是什么时候见的第一面,他支吾半天竟想不起来,第一次见面,大抵没给他留下多少印象.只是在全社大会的时候,不期然的,她就坐在了他的旁边.他注意到她的眼神,月光一样清亮.散会后,报名参加活动的表格上,他没细想星期四自己有课,就把她填的兴趣组合唱班给照搬抄了下来.慢慢的因为工作关系,他们是朋友. 如

从VGA到GPU!细数二十年显卡发展历程

VGA有很多层涵义,本来是用于代表一个分辨率(您可能不了解VGA,但应该知道QVGA代表什么),随后被普遍称为显示输出接口.为了输出VGA分辨 率.提供VGA输出接口,显卡和VGA就有了不解之缘,显卡被称为VGA Card是有历史原因的,如果您对此感兴趣的话,请慢慢看: ● 什么是VGA? VGA,Video Graphic  Array,视频图形阵列,表示一组点阵图形,长640像素宽480像素,最初能够输出640×480分辨率的接口叫做D-Sub,也被称作VGA接口, 它是一个15针的梯形插头

迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com)http://toutiao.com/a6300616158581604609/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=4592472790&