Java排序算法总结

本文详细介绍了Java中的多种排序算法,包括插入排序、冒泡排序、快速排序、简单选择排序、计数排序、桶排序等。对于每种排序算法,文章提供了算法思路和时间复杂度分析,并提到了在特定情况下的效率优势。此外,还提及了希尔排序和二路归并排序作为补充。
摘要由CSDN通过智能技术生成

本文中所有代码均可在码云中下载
notion国内替代品,wolai笔记,大家可以看一下,别忘了码:UWZD8MI


插入排序

时间复杂度: O(N^2)

插入排序:是将未排序的一组数中的一个数插入已排序的数中的合适位置。最开始,将最前端的一个数看成已排序。

算法思路:对数组遍历,内置循环,选取当前位置为临时值,往前遍历,找到合适插入位置

public class SimpleInsertSort {
    
    public  static void sort(int[] array){
        int length = array.length;
        int temp;
        for(int i=1;i<length;i++){
            temp = array[i];
            int j =i-1;
            while(j>=0 && array[j]>temp){
                array[j+1]=array[j];
                j--;
            }
            array[j+1]=temp;
    }
    }
    public static void main(String[] args) {
        int[] array={3,9,6,4,2,1,7,0,5,8};
        sort(array);
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
}

冒泡排序

Created: Jul 14, 2020 6:51 PM

Tags: 比较类排序 比较排序

时间复杂度: O( n^2 )

冒泡排序,依次将相邻的两个数比较,若前面的数比后面的数大,则将其位置调换,每一趟下来,都会将最大的数移至最后,再对其它数重复该操作,直至只剩一个数时排序完毕。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class BubbleSort{
    public void bubbleSort(int []nums){
        int length = nums.length;
        if(length<=1){
            System.out.println(nums[0]);
        }
        else{
            for(int i=0;i<length;i++){
                for(int j=0;j<length-i-1;j++){
                    if (nums[j]>nums[j+1]){
                        int temp = nums[j];
                        nums[j]=nums[j+1];
                        nums[j+1]=temp;
                    }
                }
            }
            for(int i=0;i<length;i++){
                System.out.print(nums[i]);
                System.out.print(" ");
            }
            
        }
    }
    public static void main(String[] args) {
        System.out.println("Please input arry with splited by ,");
        Scanner scanner=new Scanner(System.in);
        String str=scanner.nextLine();
        String[] Arrays=str.split(",");  
        int[] nums =new int[Arrays.length];
        for(int i=0;i<nums.length;i++){
            nums[i]=Integer.parseInt(Arrays[i]); 
            }
        
        
        BubbleSort bubble=new BubbleSort();
        bubble.bubbleSort(nums);
    }
}

快速排序

时间复杂度: O(nlogn)

排序算法:以一个数为基准,对所有数分类,将所有小于基准数的数放在左边,大于基准数的数放在右边。再对左右两边以此排序。

算法思路:采用双指针,先从右向左遍历,找到比基准数小的数,再从左往右遍历,找到比基准数大的数,将这两个数交换位置,再继续遍历,知道两个指针在同一位置。将这个位置的数与基准数交换位置。这样基准数左边都是比基准数小的数,右边都是比基准数大的数。再对左右两边排序,直到所有数都已排序。

插入排序在小规模数据或数据基本有序时高效。

public class QuickSort{
    public static void sort(int[] array, int left, int right) {
        if(left>right){
            return ;
        }
        int i = left;
        int j = right;
        int temp = array[left];
        while (i!=j) {
            while (array[j] >=temp && i<j) {
                j--;
            }
            while (array[i] <= temp && i < j) {
                i++;
            }
            if (i < j) {
                int temp_arry = array[i];
                array[i] = array[j];
                array[j] = temp_arry;
            }
        }
        array[left] = array[i];
        array[i] = temp;
       
        sort(array, left, i-1);
        sort(array, i+1, right);
    }
    public static void main(String[] args) {
        int[] array = {3,6,7,2,8,1,9,0,5,4};
        sort(array, 0, 9);
        
        for(int i = 0;i<array.length;i++){
            System.out.print(array[i]);
        }
    }
}

简单选择排序

算法原理:首先选择最小的数放在首位,再从剩下的数中选取最小的数放在已排好序的末尾,直至只剩最后一个数,至此所有数已完成排序

算法思路:选取未排序的数中最小的数,与未排序数的首位交换位置

时间复杂度:O(n)

/**
 * @param :index 获取最小数在数组中位置
 * @param :min 未排序数中最小的数
 */
public class SimpleSelectSort{
    public static int findMin(int start,int[]array){
        int min = array[start];
        int index =start;
        for(int i =start;i<array.length;i++){

            if(array[i]<=min){
                min=array[i];
                index = i;

            }

        }

        return index;
    }
    public static void sort(int[] array){
        int i=0;
        while(i<array.length){
            int min = findMin(i, array);
            System.out.println(array[min]);
            if(min!=i){

                int temp = array[i];
                array[i]= array[min];
                array[min] = temp;
            }
            i++;
        }
    }

    public static void main(String[] args) {
        int[] array={3,6,8,9,0,1,7,2,4,5};
         sort(array);
        for(int i =0;i<array.length;i++){
            System.out.print(array[i]);
        }
    }
}


##希尔排序
Created: Jul 14, 2020 8:02 PM

Tags: 比较类排序 插入排序

时间复杂度: T(n) = O(nlogn)

希尔排序:将数据分组,每组采用直接插入排序算法排序,不断减小分组间隔,直到间隔为1.

算法思路:对分组数目循环遍历,再对每一组采用直接插入排序。

public class ShellSort {
    public static void sort(int[] array){
        int length = array.length;
        for(int gap=length/2;gap>0;gap=gap/2){
            for(int i=0;i<gap;i++){
                for(int j=i+gap;j<length;j=j+gap){{
                    if(array[j]<array[j-gap]){
                        int temp =array[j];
                        int k = j-gap;
                        while(k>=0 && array[k]>temp){
                            array[k+gap]=array[k];
                            k-=gap;
                        }
                        array[k+gap]=temp;
                    }
                }}
            }
        }
        }
        public static void main(String[] args) {
            int[] array={3,6,9,5,2,1,8,7,4,0};
            sort(array);
            for(int i =0;i<array.length;i++){
                System.out.println(array[i]);
            }
        }
    }

计数排序

算法原理:计数排序是将按待排的数为数组下标生成一个新数组,遍历数组,数据每出现一次,相应下标所对应的值加一

算法思路:计算待排序数据的范围,即最大值与最小值之和,生成新数组,初始值为0,其大小为待排序数据的最大值与最小值之和加1,遍历待排序数组,若其值减去最小值与新生成数组下标一致,将新生成数组下标对应值加1

public class CountSort {
    public static void sort(int[] array) {
        int length = array.length;
        int min = 0, max = 0;
        for (int i = 0; i < length; i++) {
            if (min >= array[i]) {
                min = array[i];
            }
            if (max <= array[i]) {
                max = array[i];
            }
        }
        int d = max - min + 1;
        int[] tem_array = new int[d];
        for (int j : array) {
            tem_array[j - min]++;
        }
        for (int h = 0; h < length; h++) {
            for (int k = 0; k < tem_array[h]; k++) {
                System.out.print(h+min);
            }
        }
    }

    public static void main(String[] args) {
        int[] array={9,8,6,3,2,1,7,4,0,5};
        sort(array);

    }
}


##二路归并排序
算法原理:二路归并排序是将一个待排序数组分为两个子序列,再将两个子序列分割,按此分割下去直至不可再分。让后再将数据排序合并。

算法思路:在合并两个子序列时,创建一个新数组用来接收已排序的数据,两个指针指向两个子序列首端,比较两序列指针所指两个数大小。将较小的数放入新数组中,并将该序列指针和新数组指针向前移一位,继续比较两序列大小,直至所有数都放入新数组中。在使用二路归并时,先将左右两个子序列分割,最后归并

时间复杂度:O(nlogn)

public class TwoWayMergeSort {
    
    public static void merge(int[] array,int left,int mid,int right){
        int[] temp_array=new int[array.length];
        int leftStart = left;
        int rightStart = mid+1;
        int tempIndex = left;
        while (leftStart<=mid && rightStart<=right ){
            if (array[leftStart]<array[rightStart]){
                temp_array[tempIndex++]=array[leftStart++];
            }
            else{
                temp_array[tempIndex++]=array[rightStart++];
            }
        }
        while(leftStart <= mid) {
            temp_array[tempIndex++] = array[leftStart++];
        }

        while(rightStart <= right) {
            temp_array[tempIndex++] = array[rightStart++];
        }

        while(left <= right) {
            array[left] = temp_array[left++];
        }

    }

    public static void mergesort(int[] array,int left,int right){
        if (array==null){
            return;
        }
        if (left<right){
            int mid = (left+right)/2;
            mergesort(array,left,mid);
            mergesort(array,mid+1,right);
            merge(array,left,mid,right);

        }
    }

    public static void main(String[] args) {
        int[] array={3,1,8,9,6,5,2,4,7,0};
        mergesort(array,0,9);
        for (int i=0;i<array.length;i++){
            System.out.print(array[i]);
        }
    }
}



桶排序

算法原理:桶排序是将待排序数组分为若干组,即“桶”,将数据装入这些桶中,将每个桶内数据先排序,最后将所有桶排序合并。

算法思路:数组分桶 的依据为:

int num =(array[i]-min)/((max-min)/(length-1));

创建ArrayList类型桶,桶中元素为LinkerList类,将数据按照分组依据添加至桶中。再将桶中元素排序,最后按照顺序将同种元素合并。

时间复杂度:O(n)

import java.util.*;

public class BucketSort {
    public static void sort(int[]array){
        int length=array.length;
        int min=0;
        int max=0;
        for (int i=0;i<length;i++){
            if(min>=array[i]){
                min=array[i];
            }
            if (max<=array[i]){
                max=array[i];
            }
        }
        List<LinkedList<Integer>> bucketList = new ArrayList<>(length);
        for (int i = 0;i<length;i++){
            bucketList.add(new LinkedList<>());
        }
        for (int i=0;i<length;i++){
            int num =(array[i]-min)/((max-min)/(length-1));
            bucketList.get(num).add(array[i]);
        }
        for (int i =0;i<length;i++){
            Collections.sort(bucketList.get(i));
        }

        int k =0;
        for (LinkedList<Integer> bucket:bucketList) {
            for (int bucketIndex:bucket) {
                array[k++]=bucketIndex;
            }
        }

        for (int i=0;i<length;i++){
            System.out.print(array[i]);
        }
    }

    public static void main(String[] args) {
        int[] array={3,8,9,1,2,4,5,7,0,6};
        sort(array);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值