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到10的数字
    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);
            }
            
        }
        
}
    
    

猜你喜欢

转载自www.cnblogs.com/zzm0619/p/12753288.html