常见的几种排序算法总结

常见的几种排序算法总结,第1张

对于非科班生的我来说,算法似乎对我来说是个难点,查阅了一些资料,趁此来了解一下几种排序算法。

首先了解一下,什么是程序

关于排序算法通常我们所说的往往指的是内部排序算法,即数据记录在内存中进行排序。

排序算法大体可分为两种:

一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。

另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等

冒泡排序它重复地走访过要排序的元素,一次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

选择排序类似于冒泡排序,只不过选择排序是首先在未排序的序列中找到最小值(最大值),放到序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾,以此类推,直到所有元素均排序完毕。

插入排序比冒泡排序和选择排序更有效率,插入排序类似于生活中抓扑克牌来。

插入排序具体算法描述,以数组[3, 2, 4, 5, 1]为例。

前面三种排序算法只有教学价值,因为效率低,很少实际使用。归并排序(Merge sort)则是一种被广泛使用的排序方法。

它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。

以对数组[3, 2, 4, 5, 1] 进行从小到大排序为例,步骤如下:

有了merge函数,就可以对任意数组排序了。基本方法是将数组不断地拆成两半,直到每一半只包含零个元素或一个元素为止,然后就用merge函数,将拆成两半的数组不断合并,直到合并成一整个排序完成的数组。

快速排序(quick sort)是公认最快的排序算法之一,有着广泛的应用。

快速排序算法步骤

参考:

常用排序算法总结(一)

阮一峰-算法总结

学生实体类,包含姓名和年龄属性,

比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。

第一种:实体类自己实现比较

(实现comparable接口:public interface Comparable<T> ,里面就一个方法声明:public int compareTo(T o); )

然后利用List类的sort(Comparator< super E> c)方法或javautilCollections工具类的sort(List<T> list) (其实里面就一句:listsort(null); )进行排序:

结果:

第二种:借助比较器进行排序。

示例代码:

比较器javautilComparator类是一个接口(public interface Comparator<T> ),包含int compare(T o1, T o2);等方法:

我们的比较器要实现该接口并实现compare方法:

比较的时候可以利用List的sort(Comparator< super E> c)方法(或者javautilCollections工具类的sort(List<T> list, Comparator< super T> c)方法)进行排序。

结果跟第一种方法一样:

可以实现比较器Comparator来定制排序方案,同时使用Colletionssort的方式进行排序,代码如下:

public void sortDesc(List<Long> s){

Collectionssort(s, new Comparator<Long>() {

public int compare(Long o1, Long o2) {

Long result = o2 - o1;

return resultintValue();

}

});

sforEach(item->{

Systemoutprint(item +" ");

});

}

同时常用的比较排序算法主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。

java的冒泡排序实现如下:

public static void bubbleSort(int []arr) {        for(int i =0;i<arrlength-1;i++) {            for(int j=0;j<arrlength-i-1;j++) {//-1为了防止溢出                if(arr[j]>arr[j+1]) {                    int temp = arr[j];                                         arr[j]=arr[j+1];                                         arr[j+1]=temp;            }            }            }    }

还有非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。

学数学就是为了能在实际生活中应用,数学是人们用来解决实际问题的,其实数学问题就产生在生活中。

生活中的数学有哪些

1、工资的计算。财务收入与支出,日常的消费管理等等。

2、数学加减乘除的计算。如商品的买卖,日期的计算,时间的计算。

3、面积的计算。自家的住房面积,公园的占地面积, *** 场的活动面积等等。

4、骑自行车的时候用脚蹬一圈脚踏板自行车行走的米数。我们可以去测量车轮的半径,再用圆的周长公式求出来。

5、家庭生活成本计算,学习了数学以后就会在生活中不由自主的使用。经常被使用的是统筹方法,如煮饭过程中的一系列事物先后安排,都是有数学科学上的学问的。

6、计算机相关工作者,数学是工作中必不可少的。C语言写程序,就需要运用排序算法(如快速排序,插入排序,堆排序,归并排序,基数排序,希尔排序,桶排序,锦标赛排序等等)如果掌握《数据结构》的相关知识,就会变得非常容易。

本文翻译自官方文档,原文链接:

>

你好.T(n)=O( f (n) )表示时间问题规模n的增大,算法执行时间 的增长率和f(n)的增长率相同.称作 时间复杂度.如下:1 {++x;s=0}2 for (i=1;i<=n;++i) { ++x; s+=x;}3 for ( j=1; j<=n;++j ) for (k+1;j<=n;++k) { ++x;s+=x;}基本 *** 作“x增1”的语句的频度分别为1n和n的平方.则这三个程序段的时间复杂度分别 为.O(1) O(n)O(n平方).分别为常量阶.线性阶.和平方阶...算法可能呈现 的时间 复杂度还有对数阶O(long n) .指数阶O(2 n方)等 .空间复杂度:s(n)=O(f(n))其中n为问题的规模(或大小).一个上机执行的程序 除了需要存储空间来寄存本身所用指令.常数.变量和输入数据外.也要一些对数据进行 *** 作 的工作单元和存储一些为实现计算所需信息的空间.若输入数据所占的空间只取决于问题本身,和算法无关,则只要分析除输入和程序之处的额处空间,否则应同时考虑输入本身所需空间有点抽象...因为本人也学不好.所以.只能回答这些..见谅..

以上就是关于常见的几种排序算法总结全部的内容,包括:常见的几种排序算法总结、java 怎么将List里面数据排序、java 编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10131064.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存