知识大全 面试笔试必用-必须掌握的Java排序算法
Posted 序列
篇首语:少年意气强不羁,虎胁插翼白日飞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 面试笔试必用-必须掌握的Java排序算法相关的知识,希望对你有一定的参考价值。
面试笔试必用-必须掌握的Java排序算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
Java排序算法 )分类 )插入排序(直接插入排序 希尔排序) )交换排序(冒泡排序 快速排序) )选择排序(直接选择排序 堆排序) )归并排序 )分配排序(箱排序 基数排序) 所需辅助空间最多 归并排序 所需辅助空间最少 堆排序 平均速度最快 快速排序 不稳定 快速排序 希尔排序 堆排序 )选择排序算法的时候 数据的规模 数据的类型 数据已有的顺序 一般来说 当数据规模较小时 应选择直接插入排序或冒泡排序 任何排序算法在数据量小时基本体现不出来差距 考虑数据的类型 比如如果全部是正整数 那么考虑使用桶排序为最优 考虑数据已有顺序 快排是一种不稳定的排序(当然可以改进) 对于大部分排好的数据 快排会浪费大量不必要的步骤 数据量极小 而起已经基本排好序 冒泡是最佳选择 我们说快排好 是指大量随机数据下 快排效果最理想 而不是所有情况 )总结 ――按平均的时间性能来分 )时间复杂度为O(nlogn)的方法有 快速排序 堆排序和归并排序 其中以快速排序为最好 )时间复杂度为O(n )的有 直接插入排序 起泡排序和简单选择排序 其中以直接插入为最好 特 别是对那些对关键字近似有序的记录序列尤为如此 )时间复杂度为O(n)的排序方法只有 基数排序 当待排记录序列按关键字顺序有序时 直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言 这是最不好的情况 此时的时间性能蜕化为O(n ) 因此是应该尽量避免的情况 简单选择排序 堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变 ――按平均的空间性能来分(指的是排序过程中所需的辅助空间大小) ) 所有的简单排序方法(包括 直接插入 起泡和简单选择)和堆排序的空间复杂度为O( ) ) 快速排序为O(logn ) 为栈所需的辅助空间; ) 归并排序所需辅助空间最多 其空间复杂度为O(n ); )链式基数排序需附设队列首尾指针 则空间复杂度为O(rd ) ――排序方法的稳定性能 ) 稳定的排序方法指的是 对于两个关键字相等的记录 它们在序列中的相对位置 在排序之前和 经过排序之后 没有改变 ) 当对多关键字的记录序列进行LSD方法排序时 必须采用稳定的排序方法 ) 对于不稳定的排序方法 只要能举出一个实例说明即可 ) 快速排序 希尔排序和堆排序是不稳定的排序方法 )插入排序 包括直接插入排序 希尔插入排序 直接插入排序 将一个记录插入到已经排序好的有序表中 sorted数组的第 个位置没有放数据 从sorted第二个数据开始处理 如果该数据比它前面的数据要小 说明该数据要往前面移动 首先将该数据备份放到 sorted的第 位置当哨兵 然后将该数据前面那个数据后移 然后往前搜索 找插入位置 找到插入位置之后讲 第 位置的那个数据插入对应位置 O(n*n) 当待排记录序列为正序时 时间复杂度提高至O(n) 希尔排序(缩小增量排序 diminishing increment sort) 先将整个待排记录序列分割成若干个子序列分别进行直接插入排序 待整个序列中的记录基本有序时 再对全体记录进行一次直接插入排序
插入排序Java代码 public class InsertionSort // 插入排序 直接插入排序 希尔排序 public void straightInsertionSort(double [] sorted) int sortedLen= sorted length; for(int j= ;j
int insertPos=j; for(int k=j-inc;k>=0;k-=inc) if(sorted[k]>sorted[ ]) sorted[k+inc]=sorted[k]; //数据结构课本上这个地方没有给出判读 出错 if(k inc<=0) insertPos = k; else insertPos=k+inc; break; sorted[insertPos]=sorted[0]; public void shellInsertionSort(double [] sorted) int[] incs=7,5,3,1; int num= incs.length;
int inc=0; for(int j=0;j
int arraysize= 21; double [] sorted=new double[arraysize]; System.out.print("Before Sort:"); for(int j=1;j sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); System.out.println();
InsertionSort sorter=new InsertionSort(); // sorter.straightInsertionSort(sorted); sorter.shellInsertionSort(sorted);
System.out.print("After Sort:"); for(int j=1;j
int arraysize= 21; double [] sorted=new double[arraysize]; System.out.print("Before Sort:"); for(int j=1;j sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); System.out.println();
ExchangeSort sorter=new ExchangeSort(); // sorter.BubbleExchangeSort(sorted); sorter.QuickExchangeSortBackTrack(sorted, 1, arraysize-1); System.out.print("After Sort:"); for(int j=1;j
int minJ=1; double min= Double.MAX_VALUE; for(int j=i;j
public void heapAdjust(double [] sorted,int start,int end) if(start
for(int i=sortedLen/2;i>0;i–) heapAdjust(sorted,i,sortedLen); for(int i=sortedLen;i>1;–i) exchange(sorted,1,i); heapAdjust(sorted,1,i-1); public static void main(String [] args) Random random= new Random(6);
int arraysize=9; double [] sorted=new double[arraysize]; System.out.print(“Before Sort:”); for(int j=1;j sorted[j]= (int)(random.nextDouble()* 100); System.out.print((int)sorted[j]+" "); System.out.println();
SelectionSort sorter=new SelectionSort(); // sorter.straitSelectionSort(sorted); sorter.heapSelectionSort(sorted);
System.out.print("After Sort:"); for(int j=1;j
// 剩余部分依次置入中间数组 while (mid <= right) bridge[third++] = obj[mid++]; while (left <= center) bridge[third++] = obj[left++]; // 将中间数组的内容拷贝回原数组 copy(obj, tmp, right); private void copy(double[] obj, int left, int right) while (left <= right) obj[left] = bridge[left]; left++; public static void main(String[] args) Random random = new Random(6);
int arraysize = 10; double[] sorted = new double[arraysize]; System.out.print("Before Sort:"); for (int j = 0; j < arraysize; j++) sorted[j] = (int) (random.nextDouble() * 100); System.out.print((int) sorted[j] + " "); System.out.println();
MergeSort sorter = new MergeSort(); sorter.sort(sorted);
System.out.print("After Sort:"); for (int j = 0; j < sorted.length; j++) System.out.print((int) sorted[j] + " "); System.out.println();
8)基数排序: 使用10个辅助队列,假设最大数的数字位数为 x, 则一共做 x次,从个位数开始往前,以第i位数字的大小为依据,将数据放进辅助队列,搞定之后回收。下次再以高一位开始的数字位为依据。 以Vector作辅助队列,基数排序的Java代码: public class RadixSort private int keyNum=-1; private Vector
public void distribute(double [] sorted, int nth) if(nth<=keyNum && nth>0) util=new Vector
int arraysize = 21; double[] sorted = new double[arraysize]; System.out.print(“Before Sort:”); for (int j = 0; j < arraysize; j++) sorted[j] = (int) (random.nextDouble() * 100); System.out.print((int) sorted[j] + ” “); System.out.println();
RadixSort sorter = new RadixSort(); sorter.radixSort(sorted);
cha138/Article/program/sjjg/201405/30741相关参考
Java代码 插入排序: packagerututilalgorithmsupport; importrututilalgorithmSortUtil; publicclassInse
插入排序: packagerututilalgorithmsupport; importrututilalgorithmSortUtil; publicclassInsertSortim
各种排序算法的Java实现 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! packagesxse
publicclassSort &
选择排序选择排序的基本思想是对待排序的记录序列进行n遍的处理第i遍处理是将L[in]中最小者与L[i]交换位置这样经过i遍处理之后前i个记录的位置已经是正确的了选择排序是不稳定的算法复杂度是O(n^)
Java经典算法编程题目,适合面试前进行练习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!定义一个
2009年安徽省公务员考试笔试已经尘埃落定,考生接下来即将面对的是面试的角逐。如果说笔试考查的是考生答题速度与技巧,那么应对面试则不仅需要多方面的知识素养,还需要迅速的应变能力、语言表达能力、敏捷的思
排序算法(Java实现):Shell排序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 希尔排序
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方