Java程序员必知的8大排序(上)
Java程序员必知的8大排序(上)
本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文
AD:8种排序之间的关系:
1,直接插入排序
(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排
好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
也是排好顺序的。如此反复循环,直到全部排好顺序。
(2)实例
(3)用java实现
1package com.njue;
2
3public class insertSort {
4public insertSort(){
5
inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,3 4,15,35,25,53,51};
6int temp=0;
7for(int i=1;i 8int j=i-1; 9 temp=a[i]; 10for(;j>=0&&temp 11 a[j+1]=a[j]; //将大于temp的值整体后移一个单位 12 } 13 a[j+1]=temp; 14 } 15for(int i=0;i 16 System.out.println(a[i]); 17} 18} 2,希尔排序(最小增量排序) (1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。 (2)实例: (3)用java实现 19public class shellSort { 20public shellSort(){ 21int a[]={1,54,6,3,78,34,12,45,56,100}; 22double d1=a.length; 23int temp=0; 24while(true){ 25 d1= Math.ceil(d1/2); 26int d=(int) d1; 27for(int x=0;x 28for(int i=x+d;i 30 temp=a[i]; 31for(;j>=0&&temp 32 a[j+d]=a[j]; 33 } 34 a[j+d]=temp; 35 } 36 } 37if(d==1) 38break; 39 } 40for(int i=0;i 41 System.out.println(a[i]); 42} 43} 3.简单选择排序 (1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换; 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。 (2)实例: (3)用java实现 44public class selectSort { 45public selectSort(){ 46int a[]={1,54,6,3,78,34,12,45}; 47int position=0; 48for(int i=0;i 49 50int j=i+1; 51 position=i; 52int temp=a[i]; 53for(;j 54if(a[j] 55 temp=a[j]; 56 position=j; 57 } 58 } 59 a[position]=a[i]; 60 a[i]=temp; 61 } 62for(int i=0;i 63 System.out.println(a[i]); 64 } 65} 4,堆排序 (1)基本思想:堆排序是一种树形选择排序,是对直接选择排序的有效改进。 堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足 (hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n 个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。 (2)实例: 初始序列:46,79,56,38,40,84 建堆: 交换,从堆中踢出最大数 依次类推:最后堆中剩余的最后两个结点交换,踢出一个,排序完成。 (3)用java实现 66import java.util.Arrays; 67 68public class HeapSort { 69int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,1 5,35,25,53,51}; 70public HeapSort(){ 71 heapSort(a); 72 } 73public void heapSort(int[] a){ 74 System.out.println("开始排序"); 75int arrayLength=a.length; 76//循环建堆 77for(int i=0;i 78//建堆 79 80 buildMaxHeap(a,arrayLength-1-i); 81//交换堆顶和最后一个元素 82 swap(a,0,arrayLength-1-i); 83 System.out.println(Arrays.toString(a)); 84 } 85 } 86 87private void swap(int[] data, int i, int j) { 88// TODO Auto-generated method stub 89int tmp=data[i]; 90 data[i]=data[j]; 91 data[j]=tmp; 92 } 93//对data数组从0到lastIndex建大顶堆 94private void buildMaxHeap(int[] data, int lastIndex) { 95// TODO Auto-generated method stub 96//从lastIndex处节点(最后一个节点)的父节点开始 97for(int i=(lastIndex-1)/2;i>=0;i--){ 98//k保存正在判断的节点 99int k=i; 100//如果当前k节点的子节点存在 101while(k*2+1<=lastIndex){ 102//k节点的左子节点的索引 103int biggerIndex=2*k+1; 104//如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在 105if(biggerIndex 106//若果右子节点的值较大 107if(data[biggerIndex] 108//biggerIndex总是记录较大子节点的索引 109 biggerIndex++; 110 } 111 } 112//如果k节点的值小于其较大的子节点的值 113if(data[k] 114//交换他们 115 swap(data,k,biggerIndex); 116//将biggerIndex赋予k,开始while循环的下一次循环,重新保证k 节点的值大于其左右子节点的值 117 k=biggerIndex; 118 }else{ 119break; 120 } 121 } } } } 作者:java基础 来源:https://www.360docs.net/doc/3f16977750.html,/ 一道常考的javaSE面试题 上周一,.NET班有四个同学去面试,面试题是一道排序题,不管用什么方式做出结果就行。 就这道题我也想些想法,当时他们和我说完,我在想用什么方法可以实现。毕竟现在javaSE都忘的差不多了,现在主要学的还是javaEE方面。年前学习JSP和SERVLET一片的知识,到了年后主要学习三大框架、ajax、jquery和XML等。不过当时出现脑中的算法只有:java.util包中定义的Arrays类和冒泡法。 下面就拿上面方说的那两种方法具体说说。 在JDK的java.util包中定义的Arrays类提供了多种数据操作方法,实现了对数组元素的排序、填充、转换、增强检索和深度比较等功能,所以的这些方法都是static的,下面介绍对数组元素进行排序的方法。数组元素的排序通常是指一维数值型数组元素按升序排序,偶尔也会涉及一维String数组排序,一般来说,多维和其他引用类型的元素数组排序使用意义不大。 Arrays类中的sort()的格式: public static void sort([] a); 案例1: JDK的java.util包中定义的Arrays类提供了排序方法 一维数组排序: Java代码 1.package cn.z_xiaofei168.sort; 2. 3.import java.util.Arrays; 4. 5.public class TestArraySort { 6. 7./** 8. * @author z_xiaofei168 9. */ 10.public static void main(String[] args) { 11.int[] arr = { -1, -3, 5, 7, 9, 2, 4, 6, 8, 10 }; 12. System.out.print("整数排序前:"); 13. displayIntArr(arr); 14. Arrays.sort(arr); 15. System.out.print("整数排序后:"); 16. displayIntArr(arr); 17. Java程序员必知的8大排序<合肥软件培训> [来源:本站| 日期:2012年12月24日| 浏览173次] 字体:[大中小] 8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例 (3)用java实现 //从小到大 package com.njue; 2 3public class insertSort { 4public insertSort(){ 5 inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; 6int temp=0; 7for(int i=1;i package java项目; public class X{ public static void main(String[] args) { inti,j,t,k; final int M=100000; int []a=new int[M]; System.out.println("随机数:"); for(i=0;i package com.scott.util; import java.io.*; import java.util.ArrayList; import https://www.360docs.net/doc/3f16977750.html,parator; import java.util.Iterator; import java.util.List; /** * Created by Scott on 2017/11/1. */ public class LargeFileDataSort { // 测试大文件路径 public final static String testFilePath = "E:/dataTest/largeFileData.txt"; public final static String resultFilePath = "E:/dataTest/largeFileResult.txt"; // 切分大文件的小文件大小MB, 默认为100MB private final static int size = 200; private static int byteSize = size * 1024 * 1024; public static void main(String[] args) throws IOException { // 生成测试文件 createTestData(); Long start = System.currentTimeMillis(); work(); Long end = System.currentTimeMillis(); System.out.println((end - start) / 1000/ 60); } /** * 切分文件每份大小 */ public static void work() throws IOException { File file = new File(testFilePath); if (!file.exists()) { return; } // 2.1 得到文件大小MB double mbsize = file.length() / 1024 / 1024; // 2.2 计算得到切分的文件数 double fileNum = Math.ceil(mbsize / size); // 2.3 临时文件 List java程序员应该掌握哪些排序算法?排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。下面讲的排序都是属于内排序。在java的学习中,身为程序员的我们需要掌握以下八大排序算法。 1、直接插入排序 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。 2、希尔排序(最小增量排序) 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1 时,进行直接插入排序后,排序完成。 3、简单选择排序 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。 4、堆排序 堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆的定义如下:具有n 个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。 5、冒泡排序 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现 java的几种排序方式 用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。 插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author treeroot * @since 2006-2-2 * @version 1.0 */ public class InsertSort implements SortUtil.Sort{ /* (non-Javadoc) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */ public void sort(int[] data) { int temp; for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1); } } } } 冒泡排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author treeroot * @since 2006-2-2 * @version 1.0 */ public class BubbleSort implements SortUtil.Sort{ /* (non-Javadoc) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */ public void sort(int[] data) { int temp; for(int i=0;i for(int j=data.length-1;j>i;j--){ if(data[j] SortUtil.swap(data,j,j-1); } } } } } 选择排序: 一、插入排序 1、基本思想 插入排序(以升序为例)的基本操作是将一个数插入到一个已经排好序的数据序列中,插入后的数据序列是有序的并且元素个数加一。插入排序的主要思想是: 假设要排序的数组为A[]元素个数为n,将这个数组分为两个部分前n-1个元素和最后一个元素,将最后一个元素插入到已经排好序的n-1个元素中的合适的位置。 InsertSort(A[n]) //对A[n]进行插入排序 { for i=1 to n divide(A[i-1],a[i]) //将A[i]分为两部分,前i-1个元素和最后一个元素 Insert(a[i],A[i-1])//将最后一个元素插入到排好序的前i-1个元素中 } 2、算法复杂度分析 插入排序存在着最好情况和最坏情况,最好的情况是已经是排好序的了,这时只需比较n-1次即可;最坏的情况是序列是降序的需要排成升序的,那么此时就需要比较n(n-1)/2。插入排序的赋值操作是比较操作的次数加上n-1次。平均来说插入排序的算法复杂度为O(n2)。 3、编程实现 public static void InsertSort(int[] A){ for(int i=1;i package help; import java.util.Scanner; /** * * @author ben */ public class Help { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here int num[] = new int[11]; int num2[] = new int[11]; int max; int number = 0; int help; Scanner scanner = new Scanner(System.in); System.out.println("请输入十组数据:"); for(int x=1;x<=10;x++) { num2[x]=num[x]=scanner.nextInt(); } for(int m=1;m<=10;m++) { max=num[m]; for(int n=m;n<=10;n++) { if(num[n]>=max) { max=num[n]; number=n; } } help=num[number]; num[number]=num[m]; num[m]=help; } System.out.println("排序后的数组(由大到小)"); for(int y=1;y<=10;y++) { System.out.print(num[y]+""); } System.out.println("\n原来的数组"); for(int y=1;y<=10;y++) { System.out.print(""+num2[y]); } } } Java程序员必知的8大排序(上) 本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文 AD:8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例java 排序面试题
排序算法原理与实现(java)
java比较两种排序的优劣
JAVA实现大文件排序
java程序员需掌握这八大排序算法
java的几种排序方式
java中的各种排序案例
用java写的选择排序 (由大到小)
Java程序员必知的8大排序(上)