zoukankan      html  css  js  c++  java
  • Java交换排序:冒泡排序和快速排序

    Java交换排序:冒泡排序和快速排序

    冒泡排序:

    冒泡排序(Bubble Sort)是一种典型的交换排序。比较相邻的数值大小,若相邻中两个数值,前一个数值大于后一个数值,则交换他们两个的位置;否则,不交换。以此类推,直到最后一个数字。 (数值小的往前放,数值大的往后放) 就像石头沉入水底一样,小石头质量小,冒泡小;大石头质量大,冒泡大。

    举例:有一个原数组,经历一次冒泡排序的过程;原数组为:14,6,3,10,2

     第一次比较:14和6比较,14>6,他们两个交换位置;

     第二次比较:14和3比较,14>3,他们两个交换位置;

     第三次比较:14和10比较,14>10,他们两个交换位置;

     第四次比较:14和2比较,14>2,他们两个交换位置;

    冒泡练习:随机产生5个1到100的数字,装入数组,然后通过冒泡排序,由小到大排列出来

    package com.zzm.sort;
    
    import java.util.Random;
    
    public class Bubble {
        public static void main(String[] args) {
            bubble();
        }
    
        // 冒泡-随机产生5个1到100的数字
        public static void bubble() {
            int[] arr = new int[5];
            for (int i = 0; i < 5; i++) {
                arr[i] = new Random().nextInt(100) + 1;// 随机产生5个1到100的数字
            }
            System.out.println("冒泡排序原来数组:");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
            System.out.println("-----------------------------------");
    
            for (int i = 0; i < arr.length - 1; i++) {// 排序次数,数字长度为5,因为只用比较4次,所以减1
                for (int j = 0; j < arr.length - 1 - i; j++) {// 每次排序大的放后面,因为j+1>数组长度,所以减1;因为每排一轮最大的就放后面了,减i可以增加效率
                    if (arr[j] >= arr[j + 1]) {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                System.out.print("第" + (i + 1) + "次排序结果:");
                for (int k = 0; k < arr.length; k++) {
                    System.out.print(arr[k] + " ");
                }
                System.out.println();
            }
        }
    }

    快速排序:

    快速排序:快速排序其实是冒泡排序的一种改进版;在冒泡排序中,比较的是相邻的两个数,进过比较,大数值的往后面方法,小数值的往前面放,每次遍历一次数组,就能找到一个遍历中最大的数,放在最后,经过多次遍历数组,多次找到遍历中最大的数放在后面,最终实现数组由小到大排序。而快速排序,是在要排序的原数组中,找一个数作为标准,与第一个数或者最后一个数作比较,最终实现,这个作为标准的数,它左边的数都比它小,它右边的数狗比它大。这就算是完成一次排序了。再经过递归,就可以实现数组的由小到大的数组排序。

    举例:有一个原数组,经理一次快速排序的过程;原数组为:58,62,42,92,35

     我选着第一个数58作为标准;大的放后面,小的放前面

    第一次比较:58和35比较,58>35,58在前面,35在后面,交换它们的位置

    第二次比较:58和62比较,58<62,58在后面,62在前面,交换它们的位置

    第三次比较:58和92比较,58<92,58在前面,92在后面,不变换位置

    第四次比较:58和42比较,58>42,58在前面,42在后面,交换它们的位置

    第一次排序完成后:58左边的数都比58小,58右边的数都比58大;

    快排练习:随机产生5个1到100的数字,装入数组,然后通过快速排序排序,由小到大排列出来

    package com.zzm.sort;
    
    import java.util.Random;
    
    public class Quicksort {
        public static void main(String[] args) {
            int[] arr=new int[5];
            for(int i=0;i<5;i++){
                arr[i]=new Random().nextInt(100)+1;
            }
            System.out.println("原生快速排序数组为:");
            for(int j=0;j<5;j++){
                System.out.print(arr[j]+" ");
            }
            System.out.println();
            System.out.println("-------------------");
            
            int start=0;
            int end=arr.length-1;
            quicksort(arr,start,end);
            System.out.println("快速排序后的数组为:");
            for(int k=0;k<5;k++){
                System.out.print(arr[k]+" ");
            }
            
        }
    
        public static void quicksort(int[] arr, int low ,int high) {
            int start=low;
            int end=high;
            int key=arr[low];//不变的
            
            while(end>start){//快排第一遍,找到一个数左边的都比他小,右边的都比他大
                while(end>start&&arr[end]>=key){//拿第一个数跟最后一个数比
                    end--;//第一个数比最后一个数小,就比倒数第二个,,,,以此类推
                    }
                    if(arr[end]<=key){//如果第一个数>=最后一个数,就交换位置
                        int t=arr[end];
                        arr[end]=arr[start];
                        arr[start]=t;
                    }
                while(end>start&&arr[start]<=key){
                    start++;    
                    }
                    if(arr[start]>=key){
                        int t=arr[start];
                        arr[start]=arr[end];
                        arr[end]=t;
                    }
                }
                
                if(start>low){//标准数,左边的递归
                    quicksort(arr,low,start-1);
                }
                if(end<high){//标准数,右边的递归
                    quicksort(arr,end+1,high);
                }
                
            }
            
    }
        
        
  • 相关阅读:
    C# 对Excel文档打印时的页面设置
    C# 对Excel 单元格格式, 及行高、 列宽、 单元格边框线、 冻结设置
    object does not contain a definition for get_range
    shell变一些小技巧
    Codeforces Round #277.5 (Div. 2)A——SwapSort
    ActiveMQ与RabbitMQ采用camel综合
    SAP ABAP规划 使用LOOP READ TABLE该方法取代双LOOP内部表的方法
    Object-c中间initialize 与 辛格尔顿
    队列——阵列实现
    左右GNU Linux企业加密文件系统 eCryptfs简介
  • 原文地址:https://www.cnblogs.com/zzm0619/p/12753288.html
Copyright © 2011-2022 走看看