排序算法的个人心得体会。

引用文章A:http://blog.csdn.net/whuslei/article/details/6442755

引用介绍:介绍了排序的复杂度(time and space) 以及稳定性。

算法会在2015/3/1更新至GITHUB。Addr:https://github.com/zheng39562/arithmetic

2015/3/1版:暂定为int排序。目标为泛型算法。

本文仅介绍个人在其中遇见的问题。如果对算法并不了解/遗忘。可以阅读引用文章。也欢迎对更多的见解:)

基本概念:

  1)时间复杂度:通常分为最好和最坏情况。但通常而言基本会考虑最坏情况。因为最好情况基本都会有一定的先决条件,作为通用算法。必须按照最坏情况计算。

    1,但在针对性领域,在确定前提情况下,可以使用最好情况来编写代码(但必须有绝对把握)

  2)空间复杂度:需要的辅助空间量。

    1,牺牲时间,还是牺牲空间。并没有绝对的答案。完全看自己的情况而定。

  3)稳定性:通俗的理解即,两个在比较条件中相等的元素,在多次排序中不改变顺序。(具体见引用A)

    1)对于稳定性,个人理解,就是把所有元素都当作不同元素时(包括相等元素),排序结果依然只有一种。

    2)引用A中的一个猜测:若存在两个不相邻元素的交换,则可能是不稳定的。

1:冒泡算法。时间复杂度最坏/最好/平均:O(n2),O(n),未知。稳定性;稳定。

  1,冒泡排序大概是最容易懂的排序了吧。

2:插入算法:时间复杂度最坏/最好/平均:O(n2),O(n),O(n2)。稳定性;稳定。

  1,插入排序需要移动数组元素。所以,建议:从后往前进行比较。这并不一定会提高移动速度,但可以不需要单独做一个移动函数(从前往后,可能需要一次性移动多个元素,从后往前,则可以在判断时直接进行邻近交换)。

  2,插入排序中如果不应用其他优化。是一个比较坑爹的排序。(总是不自觉的想在其中加入其他排序算法)

3:希尔排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。

  1,无法理解为何其时间复杂度为O(nlogn)。

  2,类似与二分法来解决插入排序。

4:快速排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。

  1,while( array[i--] ... ) // 需要注意,无论循环是否执行,i都退出循环时,都会比期望的少1。如果使用此方式循环并且在后续还要继续使用 i 这个值,则需要慎重思考。

5:选择排序:时间复杂度最坏/最好/平均:O(n2),O(n2),O(n2)。稳定性;不稳定。

  1,表示实现不想写这个代码。希望我这辈子都不会用到。。。

6:堆排序:时间复杂度最坏/最好/平均:O(nlogn),未知,O(nlogn)。稳定性;不稳定。

  1,写成了heap类。当使用链表构建时,需要注意末尾指针的移动。

7:并归排序:时间复杂度最坏/最好/平均:O(nlogn),o(nlogn),O(nlogn)。稳定性;稳定。空间复杂度:O(n)

  1,这是少数几种需要占用辅助内存的常规排序方法。但,它是时间复杂度nlogn中的唯一稳定的排序方式。当对于元素位置有强烈要求时,推荐此排序方式。

8:基数排序:按位比较排序。先按照个位,再按照十位,依次类推。

  1,要求:最高位数。并且只有针对数字,或可以有类推规律的数据。

  2,其时间复杂度仅为o(n)。如果对时间要求略高,但同时符合要求,可以考虑此方式。

时间: 2024-10-13 01:38:30

排序算法的个人心得体会。的相关文章

排序算法心得

原文:https://www.cnblogs.com/xiaohuiduan/p/11188304.html 十大排序算法 基本排序算法: 选择排序 插入排序 冒泡排序 高效排序算法: 梳排序 希尔排序 快速排序 堆排序 牺牲空间节约时间的高效排序: 归并排序 基数排序 基数排序 下面我将以我自己的看法以及总结网上大神的经验分析各种排序的优缺点.时间空间复杂度. 基本排序算法 选择排序 基本原理:在数组中找到最小(或最大)的元素,存到排序的起始位置,在余下的数据中再找到最小(或最大)的元素,放到

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

8-4.桶排序算法详解

1. 桶排序介绍 桶排序(Bucket sort)是一种基于计数的排序算法,工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).当要被排序的数据内的数值是均匀分配的时候,桶排序时间复杂度为Θ(n).桶排序不同于快速排序,并不是比较排序,不受到时间复杂度 O(nlogn) 下限的影响. 桶排序按下面4步进行: 1. 设置固定数量的空桶. 2. 把数据放到对应的桶中. 3. 对每个不为空的桶中数据进行排序. 4. 拼接从不为空

几个比较复杂的排序算法php

虽然现在各种程序语言都有其各自强大的排序库函数,但是这些底层实现也都是利用这些基础或高级的排序算法. 理解这些复杂的排序算法还是很有意思的,体会这些排序算法的精妙~ 一.希尔排序(shell sort):希尔排序是基于插入排序的,区别在于插入排序是相邻的一个个比较(类似于希尔中h=1的情形),而希尔排序是距离h的比较和替换. 希尔排序中一个常数因子n,原数组被分成各个小组,每个小组由h个元素组成,很可能会有多余的元素.当然每次循环的时候,h也是递减的(h=h/n).第一次循环就是从下标为h开始.

大道至简第一章心得体会

大道至简——编程的精义  心得体会      谨以此用于苦恼编程序不得入门的人,不对之处敬请指出 “虽我之死,有子存焉:子又生孙,孙又生子:子又有子,子又有孙.子子孙孙,无穷匮也.而山不加增,何苦而不平?” ——<愚公移山>,<列子-汤问篇> 编程究其本身对大数人而言是一件很苦恼而又无法避免的事情,但是有点可笑的是编程本身实在是一件简单的事,因为“程序=算法+结构”,所谓的编程就是把一件事情交给计算机去做,然后把你的想法“告诉”计算机就行了.但是编程又是一件很“无语”的事情——因为

重新回顾九大排序算法

最近无聊想回顾一下大一学过的排序算法.目前才写了一点...心得以后再补充吧!! 1.插入排序 //插入排序 /*  * 把数组a的第n个数插入前n-1个数中,注意前n-1个数已经是排好序的了  * */ public static void insertSort(int[] arr){   int len = arr.length;   int key;   int i,j;   for(i = 1; i < len; i++){    j = i;    key = arr[i];      

听大树(宋晓楠)老师讲《高效工作与时间管理》心得体会

偶然的机会,能够听大树老师的时间管理,经过这两天的反复思考和体会,以及阅读了几篇同伴的写得心得体会,我也想把我的心得体会写下来!共同学习! 先说说大树老师的时间管理观念! 图1 大树老师在讲解 总体来说,就是收集整理->搞定->回顾, 这样的一个循环过程 一.收集 这个从六个方面来说:工作.身体.心灵.家庭.圈子.财富, 具体的意思,我就不说了. 我就说说怎么收集吧, 从这六个方面分析,得出自己想要在每个方面达到的目的,或者自己希望有一个什么样的设想, 把这所有的想法都写下来. 二.筛选 对自

面试中的排序算法总结(转)

转自http://www.codeceo.com/article/10-sort-algorithm-interview.html 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.

10 大排序算法总结

前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.桶排序等.面试官对于这些排序可能会要求比较各自的优劣.各种算法的思想及其使用场景.还有要会分析算法的时间和空间复杂度.通常查找和排序