JAVA中的数组排序算法

1.各种排序图解:

代码实现

  1 import java.util.Arrays;
  2
  3 public class ArraySort {
  4     //选择排序
  5     public static void slecteSort(int[] arr){
  6         System.out.println(Arrays.toString(arr));
  7         for(int i=0;i<arr.length;i++){
  8             int minIndex=i;
  9             for(int j=i+1;j<arr.length;j++){
 10                 if(arr[minIndex]>arr[j]){
 11                     minIndex=j;
 12                 }
 13             }
 14             if(minIndex!=i){
 15                 int temp=arr[i];
 16                 arr[i]=arr[minIndex];
 17                 arr[minIndex]=temp;
 18             }
 19         }
 20         System.out.println(Arrays.toString(arr));
 21     }
 22     //冒泡排序
 23     public static void bubSort(int[] arr){
 24         for(int i=0;i<arr.length-1;i++){            //控制比较次数:n-1次(n表示元素个数)
 25             /*
 26              * 控制相邻的两个元素比较,如果说后者小,就进行交换。
 27              * 因为每次外循环之后,都会找到一个最大值放在最后面
 28              * 所以说j能取到的最大值,应该依次减小。(j<arr.length-1-i)
 29              */
 30             for(int j=0;j<arr.length-i-1;j++){
 31                 if(arr[j]>arr[j+1]){
 32                     int b=arr[j+1];
 33                     arr[j+1]=arr[j];
 34                     arr[j]=b;
 35                 }
 36                 System.out.println("arr第"+(i+1)+"次外循环,第"+(j+1)+"次比较后:"+Arrays.toString(arr));
 37             }
 38         }
 39         System.out.println(Arrays.toString(arr));
 40     }
 41     //插入排序
 42     public static void insertSort(int[] arr){
 43
 44         for(int i=1;i<arr.length;i++){
 45             /*
 46              * 因为第一个拿出来要作比较的数,前面必须要有数,所以i从1开始
 47              */
 48             int temp=arr[i];            //temp  临时数据
 49             int index=0;
 50             /*
 51              * j一定要从外循环去除到temp数的前一个开始,一直往前面遍历,如果一直找不到比去除到temp数小的数,就到
 52              * j==-1的时候结束。
 53              * 否则,到找到比temp里面数还要小的数结束
 54              */
 55             for(int j=i-1;j>=-1;j--){
 56                 index++;
 57                 System.out.println("arr第"+i+"次外循环,第"+index+"次比较"+Arrays.toString(arr));
 58                 if(j==-1){                //如果找到最前面的没有元素可找了,就把temp放入到最前面的arr[0];
 59                     arr[0]=temp;
 60                     break;
 61                 }
 62                 if(temp<arr[j]){
 63                     arr[j+1]=arr[j];    //如果找到的元素比temp大,就往后面走一位
 64                 }else{
 65                     arr[j+1]=temp;        //如果找到元素比temp小,就在该数后面放入temp
 66                     break;                //并跳出本次循环
 67                 }
 68             }
 69         }
 70     }
 71     //递归算法——阶乘,世纪的计算过程是从最后一步开始计算
 72     public static void factorial(int b){
 73         int a=1;
 74         for (int i=1;i<=b;i++) {
 75             a*=i;
 76         }
 77         System.out.println(a);
 78     }
 79     public static int factorial1(int i){
 80         while(i!=1){
 81             System.out.println(i+"x"+(i-1)+"!");
 82         return factorial1(i-1)*i;
 83         }
 84         return 1;
 85     }
 86     //
 87     public static void merge(int[] arr,int left,int mid,int right){
 88         int[] temp=new int[right-left+1];
 89         int low1=left;
 90         int low2=mid+1;
 91         int index=0;
 92         while(low1<=mid&&low2<=right){
 93             if(arr[low1]<arr[low2]){
 94                 temp[index++]=arr[low1++];
 95             }else {
 96                 temp[index++]=arr[low2++];
 97             }
 98         }
 99         while(low1<=mid){
100             temp[index++]=arr[low1++];
101         }
102         while(low2<=right){
103             temp[index++]=arr[low2++];
104         }
105         System.out.println("left="+left);
106         System.out.println("arr="+Arrays.toString(arr));
107         for(int i=0;i<index;i++){
108             arr[left++]=temp[i];
109         }
110         System.out.println("temp="+Arrays.toString(temp));
111         System.out.println("arr"+Arrays.toString(arr));
112         System.out.println("===================================");
113     }
114     //递归的拆分一个数组
115     public static void cai(int[] arr,int left,int right){
116         int mid=(right+left)/2;
117         if(left<right){
118             cai(arr,left,mid);
119             cai(arr,mid+1,right);
120             merge(arr,left,mid,right);
121         }
122         System.out.println(Arrays.toString(arr));
123     }

时间: 2024-08-11 19:38:34

JAVA中的数组排序算法的相关文章

Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

Java中各种排序算法

//插入排序: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

Java中冒牌排序算法

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面. 即首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数.如此下去,直至最终

Java中的经典算法之选择排序(SelectionSort)

Java中的经典算法之选择排序(SelectionSort) a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序.(这里只介绍常用的简单选择排序) b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据}:第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数

Java中的查找算法之顺序查找(Sequential Search)

Java中的查找算法之顺序查找(Sequential Search) a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 找到数组中存在数据8,返回位置. 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static vo

分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)

原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较: 第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比

Java中SnowFlake 雪花算法生成全局唯一id中的问题,时间不连续全为偶数解决

package com.example.springbootshardingjdbc.util; import java.io.FileOutputStream; /** * 描述: Twitter的分布式自增ID雪花算法snowflake (Java版) * * @author * @create 2018-03-13 12:37 **/ public class SnowFlake { /** * 起始的时间戳 */ private final static long START_STMP

Java 垃圾回收 - 收集算法

续前节,前面列举了Java判断对象是否可回收的两种方法:可达性分析与引用权重法.多数虚拟机所采用的的是可达性分析方法.下面写一下Java中的垃圾收集算法. Java中垃圾收集算法主要有4中算法分别为:标记-清除法:复制算法:标记-整理法:分代收集算法.详情如下. 1.标记-清除法 标记清除法算法主要分两个阶段进行:①.标出所有需要回收的内存片段,②.回收所标记内存.此种方法存在两种不足.一.标记.清除两个过程对性能损耗较大,效率太低:二.标记清除后会产生大量的内存碎片.如下图: 2.复制算法 复

Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本知识: 数组的定义:数组(Array)是相同数据类型的数据的有序集合. 数组是引用数据类型. 数组的三个特点: [1]数组长度是确定.数组一旦申请完空间,长度不能发生变化,用length属性访问. [2]数组的元素都是同一数据类型. [3]数组是有序的 .每个元素通过下标/索引标记,索引从0开始.