首页 > 编程语言 >算法-排序算法

算法-排序算法

时间:2023-02-09 13:11:14浏览次数:47  
标签:sort arr int length ++ 算法 排序 public

 

冒泡排序

package com.sort;

//冒泡排序 时间复杂度O(n^2)
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr={1,2,3,4,5};
        int temp=0;
        boolean flag=false;//判断是否发生交换
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = i+1; j < arr.length; j++) {
//                升序排列
                if(arr[j]<arr[j-1]){
                    flag=true;
                    temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }
            }
            if(!flag){
                break;
            }else{
                flag=false;
            }
        }
        for (int i:arr
        ) {
            System.out.println(i);
        }

    }
}

插入排序

package com.sort;

import java.util.Arrays;

//插入排序 时间复杂度O(n^2)
public class InsertSort {
    public static void main(String[] args) {
        int[] arr={1,44,787,33,74};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j >0 ; j--) {
                if(arr[j]<arr[j-1]){
                    int temp=arr[j];
                    arr[j]=arr[j-1];
                    arr[j-1]=temp;
                }else{
                    break;
                }
            }
        }
    }
}

选择排序

package com.sort;

import java.lang.reflect.Array;
import java.util.Arrays;

//选择排序 时间复杂度O(n^2)
public class SelectSort {
    public static void main(String[] args) {
        int[] arr={12,87,44,78,7,67,34};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr){

        for (int j = 0; j < arr.length-1; j++) {
            int indexmin=j;
            int min=arr[j];
            for (int i = j+1; i < arr.length; i++) {
                if(min > arr[i]){
                    min=arr[i];
                    indexmin = i;
                }
            }
            if(indexmin != j) {
                arr[indexmin] = arr[j];
                arr[j] = min;
            }

        }



    }
}

希尔排序

package com.sort;

import java.util.Arrays;

//希尔排序 时间复杂度O(n long n)
public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {2, 5, 8, 1, 4, 9, 7, 3, 0, 6};
//        sort(arr);//交换法
        sort2(arr);
        System.out.println(Arrays.toString(arr));
    }

//    交换法 不推荐
    public static void sort(int[] arr) {
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < arr.length; i++) {
                for (int j = i - gap; j >= 0; j -= gap) {
                    if (arr[j] > arr[j + gap]) {
                        int temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }
            }


        }
    }

//    移位法
    public static void sort2(int[] arr){
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            for (int i = gap; i < arr.length; i++) {
                int j=i;
                int temp=arr[i];
                if(arr[j]<arr[j-gap]){
                    while (j-gap>=0 && temp<arr[j-gap]){
                        arr[j]=arr[j-gap];
                        j-=gap;
                    }
                    arr[j]=temp;
                }
            }
        }
    }
}

快速排序

package com.sort;

import java.util.Arrays;

//快速排序 时间复杂度O(n long n)
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {-1, -10, 6, 3, 0, 4};
        sort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr, int left, int right) {
        int l = left;
        int r = right;
        int p = arr[(left + right) / 2];
        int temp = 0;
        while (l < r) {
            while (arr[l] < p) {
                l += 1;
            }
            while (arr[r] > p) {
                r -= 1;
            }
            if (l >= r) {
                break;
            }
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            if (arr[l] == p) {
                r -= 1;
            }
            if (arr[r] == p) {
                l += 1;
            }

        }
        if (l == r) {
            l += 1;
            r -= 1;
        }
        if (left < r) {
            sort(arr, left, r);
        }
        if (right > l) {
            sort(arr, l, right);
        }
    }


}

归并排序

package com.sort;

import java.util.Arrays;

//归并排序 时间复杂度O(n long n)
public class MergetSort {
    public static void main(String[] args) {

        int[] arr={11,3,16,8,4,5,0,8};
        int[] temp=new int[arr.length];
        sort(arr,0, arr.length-1,temp );
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr, int left, int right, int[] temp){
        if(left<right){
            int mid=(left+right)/2;
            sort(arr,left,mid,temp);
            sort(arr,mid+1,right,temp);
            merge(arr,left,mid,right,temp);
        }
    }

    public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int i = left;
        int j = mid + 1;
        int t = 0;
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[t] = arr[i];
                t++;
                i++;
            } else {
                temp[t] = arr[j];
                t++;
                j++;
            }

        }

//      将剩余的传入到temp数组中
        while (i <= mid) {
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j <= right) {
            temp[t] = arr[j];
            t++;
            j++;
        }

//        数组拷贝
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right) {
            arr[tempLeft]=temp[t];
            t++;
            tempLeft++;
        }


    }
}

基数排序

package com.sort;

import java.util.Arrays;

//基数排序 O(n*k)
//缺点:数组中不能含有负数,空间换时间,占用内存较大

public class RadixSort {
    public static void main(String[] args) {
        int[] arr={1,5,7,2,98,3,88,246,1478};
//        int[] arr = new int[80000];
//        for (int i = 0; i < arr.length; i++) {
//            arr[i] = (int) (Math.random() * 8000);
//        }
//        测试运行运行时间
//        开始时间
//        long startTime = System.currentTimeMillis();
        sort(arr);
//        long endTime = System.currentTimeMillis();
//        System.out.println("程序运行时间:" + (double) (endTime - startTime) / 1000 + "s");


        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr) {
        int max = arr[0];
//        得到数组中的最大值
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
//        判断数组中最大值的位数
        int maxLength = (max + "").length();
//        定义一个二维数组,每一个一维数组就是一个桶
        int[][] bucked = new int[10][arr.length];
//        定义一维数组,记录每个桶中存放的数据
        int[] backEleCount = new int[10];

        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            for (int j = 0; j < arr.length; j++) {
//                取出每个元素个位值
                int digitOfEle = arr[j] / n % 10;
//                存放到桶中
                bucked[digitOfEle][backEleCount[digitOfEle]] = arr[j];
                backEleCount[digitOfEle]++;
            }
//            从一维数组中依次取出数据
            int index = 0;
            for (int j = 0; j < backEleCount.length; j++) {
                if (backEleCount[j] != 0) {
//                    遍历第j个桶中的元素 放入到数组中
                    for (int k = 0; k < backEleCount[j]; k++) {
                        arr[index++] = bucked[j][k];
                    }
                }
                backEleCount[j] = 0;
            }

        }
    }
}

 

标签:sort,arr,int,length,++,算法,排序,public
From: https://www.cnblogs.com/xming2023/p/17104921.html

相关文章

  • 数据结构与算法-十大排序算法(动画演示)
    1.排序算法的概念1.1.算法相关名词;稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。时间复杂度......
  • 排序 sort
    排序sort 概述总结 视频讲解地址:https://space.bilibili.com/267053389/channel/collectiondetail?sid=369535基础排序讲解冒泡 https://www.bilibili.com/video/B......
  • 数据结构与算法-静态查找表
    1.顺序查找顺序表的结构定义如下://静态表的表长constintMaxsize=20;typedefstruct{//关键字KeyTypekey;}TableElm;typedefstruct{TableElmelm[Max......
  • 数据结构与算法-查找
    查找就是从大量的数据元素中找出指定的数据元素。在学习查找之前,我们必须先知道一些相关的概念。1.查找表由同一类型的数据元素(或记录)构成的集合。2.关键字(键)用来标识数据......
  • 数据结构与算法-二叉排序树
    一棵二叉排序树(BinarySortTree)(又称二叉查找树)或者是一棵空二叉树,或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值;2.若......
  • 数据结构与算法-拓扑排序
    在工程实践中,一个工程往往由若干个子项目组成,这些子项目中往往有两种关系。1.先后关系,即必须在一个子项目完成后,才能开始实施另一个子项目。2.子项目间无关系,即两个子项目......
  • 数据结构与算法-求最短路径之迪杰斯特拉(Dijkstra)算法
    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径,它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。1.......
  • mysql分组排序
    mysql的分组排序在实际应用中是经常用到的之前用pgsql的时候是有窗口函数来实现的,非常方便row_number()over(partitionby分组字段orderby排序字段desc)但是现......
  • sort()排序以及多个属性数组对象排序(按条件排序)
    原生排序letarr=[5,2,1,4,9,8]for(leti=0;i<arr.length;i++){for(letj=0;j<arr.length-1;j++){if(arr[j]>......
  • 2.K个排序链表归并(Leetcode 23)
    方法一:#include<stdio.h>structListNode{ intval; ListNode*next; ListNode(intx):val(x),next(NULL){}};#include<vector>#include<algorithm>b......