首页 > 编程语言 >数据结构八大排序的java实现

数据结构八大排序的java实现

时间:2024-10-16 19:49:11浏览次数:13  
标签:arr 排序 java temp int void static 数据结构 public

冒泡排序

package 排序;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int j=0;j<arr.length;j++) {
            for(int i=0;i<arr.length-1-j;i++) {
                if(arr[i]>arr[i+1]) {
                    //进行交换
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }
    }
}


堆排序

package 排序;

import java.util.Arrays;

public class HeapSort {  
    public static void main(String[] args) {  
        int[] arr = {65,67,46,2,0,34,16,66};  
          
        // 1. 构建大顶堆,从最后一个非叶子节点开始构建大顶堆
        for (int p = arr.length-1; p >= 0; p--) {  
            adjust(arr, p, arr.length);  
        }  
          
        // 2. 堆排序  
        for (int i = arr.length - 1; i > 0; i--) {  
            // 交换堆顶(当前最大值)和堆的最后一个元素  
            int temp = arr[0];  
            arr[0] = arr[i];  
            arr[i] = temp;  
              
            // 对剩余的元素重新调整为大顶堆  
            adjust(arr, 0, i);  
        }  
        System.out.println(Arrays.toString(arr));
    }  
      
    // 堆的维护(调整为大顶堆)  
    public static void adjust(int[] arr, int parent, int length) {  
        int child = 2 * parent + 1;  
        while (child < length) {  
            int rchild = child + 1;  
            int largest = child; // 假设左孩子最大  
              
            if (rchild < length && arr[rchild] > arr[largest]) {  
                largest = rchild; // 右孩子更大  
            }  
              
            // 如果父节点小于最大的子节点,则交换  
            if (arr[parent] < arr[largest]) {  
                int temp = arr[parent];  
                arr[parent] = arr[largest];  
                arr[largest] = temp;  
                  
                // 继续向下调整  
                parent = largest;  
                child = 2 * parent + 1;  
            } else {  
                break; // 父节点已经大于或等于最大的子节点,无需继续调整  
            }  
        }  
    }  
}

插入排序

package 排序;

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int i=1;i<arr.length;i++) {
            //用j和j+1进行比较交换
            for(int j=i-1;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 排序;

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        Mergesort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    //拆分
    public static void Mergesort(int[] arr,int left,int right) {
        //递归出口
        if(left==right) {
            return;
        }
        int mid = (left + right)/2;
        Mergesort(arr,left,mid);
        Mergesort(arr,mid+1,right);
        //合并
        merge(arr,left,right,mid);
    }
    public static void merge(int[] arr,int left,int right,int mid) {
        //定义第一段和第二段的开始
        int s1 = left;
        int s2 = mid+1;
        //定义临时空间
        int[] temp = new int[right-left+1];
        int index = 0;//定义游标遍历临时空间
        while(s1<=mid&&s2<=right) {
            if(arr[s1]<arr[s2]) {
                temp[index] = arr[s1];
                s1++;
                index++;
            }else {
                temp[index] = arr[s2];
                s2++;
                index++;
            }
        }
        //判断s1中是否有数据,如果有将其放入临时数组
        while(s1<=mid) {
            temp[index] = arr[s1];
            s1++;
            index++;
        }
        //判断s2中是否有数据,如果有将其放入临时数组
        while(s2<=right) {
            temp[index] = arr[s2];
            s2++;
            index++;
        }
        //将临时数组中的数据写回原数组
        for(int j=0;j<temp.length;j++) {
            arr[left + j] = temp[j];
        }
    }
}
 

快速排序

package 排序;  
  
import java.util.Arrays;  
  
public class QuickSort {  
    public static void main(String[] args) {  
        int[] arr = {65, 67, 46, 27, 10, 34, 16, 66};  
        quicksort(arr, 0, arr.length - 1); // 注意这里修改为 arr.length - 1  
        System.out.println(Arrays.toString(arr));  
    }  
  
    public static void quicksort(int[] arr, int left, int right) {  
        if (left >= right) {  
            return; // 当左索引不小于右索引时,无需排序  
        }  
  
        // 定义基准数  
        int base = arr[left];  
        // 定义i, j  
        int i = left;  
        int j = right;  
  
        while (i != j) {  
            // j游标从后往前移动,找比基准数小的  
            while (arr[j] >= base && i < j) {  
                j--;  
            }  
            // i游标从前往后移动,找比基准数大的  
            while (arr[i] <= base && i < j) {  
                i++;  
            }  
            // i和j交换  
            if (i < j) { // 确保不交换相同索引的元素  
                int temp = arr[i];  
                arr[i] = arr[j];  
                arr[j] = temp;  
            }  
        }  
  
        // i和j相遇,将基准数放到正确的位置  
        arr[left] = arr[i];  
        arr[i] = base;  
  
        // 排序左边和右边(不包括已经排序好的基准数位置)  
        quicksort(arr, left, i - 1); // 注意这里是 i - 1  
        quicksort(arr, i + 1, right);  
    }  
}

基数排序

package 排序;  
  
import java.util.Arrays;  
  
public class RadixSort {  
    public static void main(String[] args) {  
        int[] arr = {9, 7, 45, 2, 10, 3, 17, 66};  
        sort(arr);  
        System.out.println(Arrays.toString(arr));  
    }  
  
    public static void sort(int[] arr) {  
        int max = arr[0];  
        for (int j = 0; j < arr.length; j++) {  
            if (arr[j] > max) {  
                max = arr[j];  
            }  
        }  
        int maxLen = (max + "").length();  
  
        // 定义桶  
        int[][] bucket = new int[10][arr.length];  
        // 定义桶记录工具  
        int[] elementCounts = new int[10];  
        int n = 1;  
  
        for (int m = 0; m < maxLen; m++) {  
            // 遍历数组,将数组中的数据放入桶中  
            for (int i = 0; i < arr.length; i++) {  
                int digit = (arr[i] / n) % 10; // 获取当前位的数字  
                int count = elementCounts[digit];  
                bucket[digit][count] = arr[i];  
                elementCounts[digit]++;  
            }  
  
            // 将桶中的数据取出  
            int index = 0; // 遍历待排序数组的游标  
            for (int k = 0; k < elementCounts.length; k++) {  
                if (elementCounts[k] != 0) {  
                    for (int i = 0; i < elementCounts[k]; i++) {  
                        arr[index] = bucket[k][i];  
                        index++;  
                    }  
                }  
                elementCounts[k] = 0; // 重置桶计数  
            }  
            n *= 10; // 移动到下一个位数  
        }  
    }  
}

选择排序

package 排序;

import java.util.Arrays;

public class SelectSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        
        for(int j=0;j<arr.length;j++) {
            int min = arr[j];//记录最小值
            int minIndex = j;//记录最小值下标
            //找真正的最小值
            for(int i=j;i<arr.length;i++) {
                if(arr[i]<min) {
                    min = arr[i];
                    minIndex = i;
                }
            }
            //真正的最小值和待排序数组中的第一个进行交换
            arr[minIndex]  = arr[j];
            arr[j] = min;
        }
    }
}
 

希尔排序

package 排序;

import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {5,7,4,2,0,3,1,6};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(int[] arr) {
        for(int grp = arr.length/2;grp>0;grp=grp/2) {
            for(int i = grp;i<arr.length;i++) {
                //arr[j] arr[j+grp]进行比较
                for(int j=i-grp;j>=0;j=j-grp) {
                    if(arr[j] > arr[j+grp]) {
                        int temp = arr[j];
                        arr[j] = arr[j+grp];
                        arr[j+grp] = temp;
                    }else {
                        break;
                    }
                }
            }
        }
    }
}
 

标签:arr,排序,java,temp,int,void,static,数据结构,public
From: https://blog.csdn.net/m0_73971785/article/details/142888820

相关文章

  • 2024年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • Java最新版面试题(全网最全、高频)
    面向对象三大特性1、面向对象的特征有哪些方面面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。封装:封装把一个对象的属性私有......