排序算法稳定性

基数排序--数据结构排序(JAVA)

女生的网名这么多〃 提交于 2020-02-19 04:24:58
基数排序介绍(桶排序)介绍: 1) 基数排序 属于“分配式”排序,又称“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的 元素分配 至某些“桶”中,达到排序的作用; 2)基数排序法是属于稳定性的排序,基数排序法是效率高的 稳定性排序法 ; 3)基数排序是 桶排序 的拓展; 4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按照每个位数分别比较。 基数排序基本思想:     将所有待比较数值统一为同样的数为长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。 基数排序图文说明: 代码实现: import java . util . Arrays ; public class RadixSort { public static void main ( String args [ ] ) { int [ ] arr = { 53 , 3 , 542 , 748 , 14 , 214 } ; radixSort ( arr ) ; } public static void radixSort ( int [ ] arr ) { int max = arr [ 0 ] ; for ( int i = 1 ; i < arr . length ; i ++ )

一文道破快速排序从理解到优化

本小妞迷上赌 提交于 2020-02-18 20:12:33
快速排序 快速排序(QuickSort)是对冒泡排序(BubbleSort)的一种改进。 快速排序由C. A. R. Hoare在1960年提出,这是这位图灵奖得主在很年轻的时候想出来的,XMSL。 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 其基本的编程实现,我已经在这篇文章中展示过了,各种排序算法都有—— 《基础排序算法大全(Java语言描述)》 。 快排的效率很高,对随机序列是很好使的,但也可能遇到O(N 2 )的糟糕情况。不过只要加以优化这种情况基本不可能出现。 快速排序是数据结构与算法的重要知识,是程序员和计算机专业学生必知必会的重要算法,是面试的常考重点,其性能优化也是需要思考的问题…… 总之,一定要会!很会很会! 快速排序的流程 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分

算法之排序一

折月煮酒 提交于 2020-02-18 18:44:22
算法之排序一 一、排序 经典排序:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。排序算法优越评价有三个指标,执行效率、内存消耗、稳定性,一般来讲,在分析效率时会从几个方面来衡量: 时间复杂度。会从最好、最坏和平均情况三个来分析; 时间复杂度的系数、常数 、低阶。在对同一阶时间复杂度的排序算法性能对比的时候,我们就要把系数、常数、低阶也考虑进来。 比较次数和交换(或移动)次数。 二、 冒泡排序 冒泡排序是最基本最简单的排序了,基本的思想就是,比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [Java] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 public class demo_sort { public static void main(String[] args) { //冒泡排序算法 int [] numbers= new int []{ 1 , 5 , 8 , 2 , 3 , 9 , 4 }; int i,j;

java基础算法之选择排序

非 Y 不嫁゛ 提交于 2020-02-17 08:50:26
选择排序   选择排序(Selection sort)是一种简单直观的 排序算法 。它的工作原理是每一次从待排序的 数据元素 中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 时间复杂度   选择排序的交换操作介于 0 和 (n - 1) 次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次数比 冒泡排序 少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。 算法稳定性   选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。 选择排序代码   通过外循环,默认第一个数为最小下标,赋值于k,通过内循环找到比k下标还小的数,并记录下来,内循环找到这一趟排序的最小记录下来,然后与外循环的最小对比,如果2者不相等就替换位置。即k永远保持待排序数据中最小的数的下标,最后和当前位置i互换数据即可。 package com.roc.select; /** *

Java常用排序算法

徘徊边缘 提交于 2020-02-13 12:15:59
在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。 一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并,使顺串的长度逐渐增大,直到所有的待排序的几率成为一个顺串为止。 内排序可以分为以下几类: (1)、插入排序:直接插入排序、折半插入排序、希尔排序。 (2)、选择排序:简单选择排序、堆排序。 (3)、交换排序:冒泡排序、快速排序。 外排序可以分为一下几类(既使用内部存储也使用外部存储,内存不够时建议使用): (4)、归并排序 (5)、基数排序 稳定性:就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。再简单具体一点,如果A i == A j,Ai 原来在 Aj 位置前,排序后 Ai 仍然是在 Aj 位置前。 不稳定:简单选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法 稳定:冒泡排序、直接插入排序、折半插入排序,归并排序和基数排序都是稳定的排序算法。 平均时间复杂度 O(n^2):直接插入排序,简单选择排序

排序算法之选择排序

依然范特西╮ 提交于 2020-02-11 03:34:32
一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1) (用于交换和记录索引) 稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现 1 #include<stdio.h> 2 int main() 3 { 4 int array[] = {3, 1, 5, 2, 6 ,4}; 5 int count = sizeof(array) / sizeof(array[0]); 6 for (int i = 0; i < count - 1; i++) { 7 int minIndex = i; 8 for (int j = minIndex + 1; j < count; j++) { 9 if (array[minIndex] > array[j]) { 10 minIndex = j; 11 } 12 } 13 if (minIndex != i) { 14 int temp = 0; 15 temp = array

十大排序算法之快速排序

回眸只為那壹抹淺笑 提交于 2020-02-10 12:18:14
算法归类 简单排序:插入排序、选择排序、冒泡排序(必学) 分治排序:快速排序、归并排序(必学) 分配排序:桶排序、基数排序 树状排序:堆排序(必学) 其他:计数排序(必学)、希尔排序 快速排序 原理:核心思想是通过一个支点进行数据拆分,左边的数据小于这个支点,右边的数据大于支点,然后把左边和右边的做一次递归,直到递归结束。 phpcode实现 $data = array ( 2 , 1 , 3 , 9 , 4 , 6 , 5 , 8 , 7 ) ; $dataNum = count ( $data ) ; $leftIndex = 0 ; $rightIndex = $dataNum - 1 ; quickSort ( $data , $leftIndex , $rightIndex ) ; print_r ( $data ) ; function quickSort ( & $data , $leftIndex , $rightIndex ) { $i = $leftIndex ; $j = $rightIndex ; $pivot = $data [ floor ( ( $leftIndex + $rightIndex ) / 2 ) ] ; while ( $i <= $j ) { while ( $data [ $i ] < $pivot ) { $i ++ ; }

算法系列【希尔排序】篇

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-09 05:18:56
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度 : 1. 平方阶 (O(n2)) 排序各类简单排序:直接插入、直接选择和冒泡排序。 2. 线性对数阶 (O(nlog2n)) 排序快速排序、堆排序和归并排序; 3. O(n1+§))排序,§ 是介于 0 和 1 之间的常数。希尔排序 4. 线性阶 (O(n)) 排序基数排序,此外还有桶、箱排序。 关于稳定性 : 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释 : n :数据规模 k :“桶”的个数 In-place :占用常数内存,不占用额外内存 Out-place :占用额外内存 稳定性 :排序后 2 个相等键值的顺序和排序之前它们的顺序相同 希尔排序 希尔排序(Shell Sort)是插入 排序 的一种。是针对直接插入排序 算法 的改进。该方法又称缩小 增量 排序,因DL.Shell于1959年 提出 而得名。 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 但插入排序一般来说是低效的

归并排序

社会主义新天地 提交于 2020-02-09 01:29:56
归并排序 定义 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可 算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 代码实现 def merge_sort ( alist ) : if len ( alist ) <= 1 : return alist # 二分分解 num = len ( alist ) / 2 left = merge_sort ( alist [ : num ] ) right = merge_sort ( alist [ num : ] ) # 合并 return merge ( left , right ) def merge ( left , right ) : '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组''' #left与right的下标指针 l , r = 0 , 0 result = [ ] while l < len ( left ) and r < len ( right ) : if

数据结构与算法(排序算法稳定性)

送分小仙女□ 提交于 2020-02-08 04:01:38
排序与搜索 排序算法(英语:sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 **稳定性:**稳定排序算法会让原本有相等键值的记录维持相对次序,也就是如果一个排序算法是稳定的,当有两个相等键值的记录R和S,且在原本的列表种R出现在S之前,在排序过的列表中R也会在S之前。 当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4,1) ,(3,1),(3,7),(5,6) 在这个情况下,有可能产生两种不同的结果,一个是让相等键值的记录维持相对的次序,而另外一个则没有: (3,1),(3,7),(4,1) ,(5,6) (维持次序) (3,7),(3,1),(4,1), (5,6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变记录的相对次序,但是稳定排序算法从来不会如此,不稳定排序算法可以被特别的实现为稳定。做这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象之间比较,(比如上面的比较中加入第二个标准,第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而要记住这种次序通常牵涉到额外的空间负担。 来源: CSDN 作者: 阴天了 链接: https://blog.csdn.net/sun_xiao_kai