Java 实现常见六大排序算法(快排、堆排、归并、选择、冒泡、插入)

该博客主要展示了优化后的快速排序、插入排序、归并排序、冒泡排序、选择排序和堆排序的Java实现。通过三数取中法优化了快速排序的基准值选取,并在数据量小时切换为插入排序,提高了小规模数据的排序效率。同时,还提供了完整的代码示例。
摘要由CSDN通过智能技术生成
package sort;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{
    //1.快排 + 两种优化
    public static void quickSort(List<Integer> arr,int l,int r) {
        if(r-l <= 10){          //优化一:当数据量较小时改为插入排序
            insertSort(arr);
            return;
        }
        int i=l,j=r;
        int key = medi(arr.get(0),arr.get(r-l),arr.get((l+r-l)/2));  //优化二:基准值采用三数取中法
        while(i < j){
            while(i<j && arr.get(j)>=key)    j--;
            arr.set(i,arr.get(j));
            while(i<j && arr.get(i)<=key)   i++;
            arr.set(j,arr.get(i));
        }
        arr.set(i,key);
        quickSort(arr,l,i-1);
        quickSort(arr,i+1,r);
    }
    public static int medi(int x, int y, int z) {
        int maxV = Math.max(x,y);
        maxV = Math.max(maxV,z);
        int minV = Math.min(x,y);
        minV = Math.min(minV,z);
        return x+y+z-minV-maxV;
    }
    
    //2.插入排序
    public static void insertSort(List<Integer> arr){
        int n = arr.size();
        for(int i=1;i<n;i++){
            int key = arr.get(i),j = i-1;
            while(j>=0 && arr.get(j) > key){
                arr.set(j+1,arr.get(j));
                j--;
            }
            arr.set(j+1,key);
        }
    }

    //3.归并排序
    public static void mergerSort(List<Integer> arr,int left, int right, int[] temp) {
        if(right - left <= 1)   return;
        int mid = left + (right-left)/2;
        mergerSort(arr,left,mid,temp);
        mergerSort(arr,mid,right,temp);
        int i=left,j=mid,index=left;
        while(i < mid || j < right){
            if(j>=right ||(i<mid && arr.get(i)<arr.get(j)))
                temp[index++] = arr.get(i++);
            else
                temp[index++] = arr.get(j++);
        }
        for(int k=left;k<right;k++)
            arr.set(k,temp[k]);
    }
     
    //4.冒泡排序
    public static void bubbleSort(List<Integer> arr) {
        int n = arr.size();
        for(int i=1;i<n;i++){
            for(int j=1;j<n-i+1;j++){
                if(arr.get(j) < arr.get(j-1)){
                    int temp = arr.get(j);
                    arr.set(j,arr.get(j-1));
                    arr.set(j-1,temp);
                }
            }
        }
    }

    //5.选择排序
    public static void selectSort(List<Integer> arr) {
        int n = arr.size();
        for(int i=0;i<n;i++){
            int min=arr.get(i),minIndex = i;
            for(int j=i+1;j<n;j++){
                if(arr.get(j) < min){
                    minIndex = j;
                }
                int temp = arr.get(i);
                arr.set(i,arr.get(minIndex));
                arr.set(minIndex,temp);
            }
        }
    }

    //6.堆排序
    public static void heapSort(List<Integer> arr) {
        int n = arr.size();
        for(int i=(n-1)/2;i>=0;i--)
            adjustHeap(arr,i,n);
        for(int i=n-1;i>0;i--){
            int temp = arr.get(i);
            arr.set(i,arr.get(0));
            arr.set(0,temp);
            adjustHeap(arr,0,i);
        }
    }
    public static void adjustHeap(List<Integer> arr, int parent, int length) {
        int lchild = parent*2 + 1;
        int temp = arr.get(parent);
        while(lchild < length) {
            int rchild = lchild+1;
            if(rchild < length && arr.get(lchild)<arr.get(rchild))
                lchild++;
            if(temp >= arr.get(lchild)) break;
            arr.set(parent,arr.get(lchild));
            parent = lchild;
            lchild = lchild*2 + 1;
        }
        arr.set(parent,temp);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while(sc.hasNext()){
            String[] str = sc.nextLine().trim().split(" ");
            List<Integer> arr = new ArrayList<>();
            for(String s : str){
                arr.add(Integer.valueOf(s));
            }
//            quickSort(arr,0,arr.size()-1);
//            insertSort(arr);
//            mergerSort(arr,0,arr.size(),new int[arr.size()]);
//            selectSort(arr);
//            bubbleSort(arr);
            heapSort(arr);
            for(int a : arr)
                System.out.print(a + " ");
            System.out.println();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值