排序算法(Java实现)

目录

常见排列列表

算法程序编写原则

对数器——验证算法

1.选择排序

2.冒泡排序

3.插入排序

4.希尔排序

5.归并排序

6.快速排序

双轴快排(Dual Pivot Quicksort)

Array.sort流程图

7.计数排序

验证测试类

8.基数排序

9.桶排序


常见排列列表

算法程序编写原则

对数器——验证算法

可以通过以下代码实现对数器来验证各个排序算法的正确与否

import java.util.Arrays;
import java.util.Random;

public class DataChecker {

    static int[] generateRandomArray(){
        Random r = new Random();
        int[] arr = new int[10000];
        for (int i = 0; i < arr.length; i++){
            arr[i] = r.nextInt(10000);
        }
        return arr;
    }

    static void check(){
        boolean same = true;
        for (int times=0; times<1000; times++){
            int[] arr = generateRandomArray();
            int[] arr2 = new int[arr.length];
            System.arraycopy(arr, 0, arr2, 0, arr.length);

            Arrays.sort(arr);
            Selection.sort(arr2);
            Bubble.sort(arr2);
            Insertion.sort(arr2);
            Shell.sort(arr2);
            Merge.sort(arr2,0,arr2.length-1);
            Quick.sort(arr2,0,arr.length-1);

            for (int i = 0; i < arr2.length; i++){
                if (arr[i] != arr2[i]) same = false;
            }
        }

        System.out.println(same == true ? "right" : "wrong");
    }

    public static void main(String[] args){
        check();
    }
}

1.选择排序

 

 

public class Selection {

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

    static void sort(int[] arr) {

	    for (int i = 0; i < arr.length - 1; i++){
	        int minPos = i;
            for (int j = i + 1; j < arr.length; j++){
                minPos = arr[j] < arr[minPos] ? j : minPos;
            }

            swap(i,minPos,arr);
        }
    }

    static void swap(int i,int j,int[] arr){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr){
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i] + " ");
        }
    }

}

2.冒泡排序

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

    static void sort(int[] arr){
        for (int i=arr.length-1; i>0; i--)
            findMax(arr,i);
    }

    static void findMax(int[] arr,int i){
        for (int j=0; j<i; j++)
            if (arr[j] > arr[j+1]) swap(arr, j, j+1);
    }

    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr){
        for (int i=0; i<arr.length; i++)
            System.out.print(arr[i] + " ");
    }

}

3.插入排序

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

    static void sort(int[] arr){
        for (int i=1; i<arr.length; i++)
            for (int j=i; j>0 && arr[j-1]>arr[j]; j--)
                swap(arr, j, j-1);
    }

    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
    }
}

4.希尔排序

 

public class Shell {
    public static void main(String[] args){
        int[] arr = {9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2};
        sort(arr);
        print(arr);
    }

    static void sort(int[] arr){
        int h = 1;
        while (h <= arr.length/3 ){
            h = h*3 + 1;
        }
        
        for (int gap = h; gap>0; gap = (gap-1)/3 )
            for (int i=gap; i<arr.length; i+=gap)
                for (int j=i; j>0; j-=gap)
                    if (arr[j] < arr[j-gap]) swap(arr,j,j-gap);
    }

    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr){
        for (int i=0; i<arr.length; i++)
            System.out.print(arr[i] + " ");
    }
}

5.归并排序

public class Merge {
    public static void main(String[] args){
        int[] arr = {1, 4, 7, 8, 3, 6, 9};
        sort(arr,0,arr.length-1);
        print(arr);
    }

    public static void sort(int[] arr, int left, int right){
        if (left == right) return;
        int mid = left + (right - left)/ 2;
        //左边排序
        sort(arr, left, mid);
        //右边排序
        sort(arr,mid+1, right);
        merge(arr, left, mid+1, right);
    }

    static void merge(int[] arr, int leftPtr, int rightPtr, int rightBound){
        int mid = rightPtr - 1;
        int[] temp = new int[rightBound - leftPtr + 1];

        int i = leftPtr;
        int j = rightPtr;
        int k = 0;

        while (i <= mid && j <= rightBound)
            temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];

        while (i <= mid)
            temp[k++] = arr[i++];

        while (j <= rightBound)
            temp[k++] = arr[j++];

        for (int m = 0; m<temp.length; m++)
            arr[leftPtr + m] = temp[m];

    }

    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr){
        for (int i=0; i<arr.length; i++){
            System.out.print(arr[i] + " ");
        }
    }
}

6.快速排序

public class Quick {
    public static void main(String[] args){
        int[] arr = {1, 4, 6, 9, 10, 2, 3, 5, 8, 7};
        sort(arr,0,arr.length-1);
        print(arr);
    }

    public static void sort(int[] arr, int leftBound, int rightBound){
        if (leftBound >= rightBound) return;
        int mid = partition(arr,leftBound,rightBound);
        sort(arr,leftBound,mid-1);
        sort(arr,mid+1,rightBound);
    }

    static int partition(int[] arr, int leftBound, int rightBound){
        int piovt = arr[rightBound];
        int left = leftBound;
        int right = rightBound -1;

        while (left <= right) {
            while (left <= right && arr[left] <= piovt) left++;
            while (left <= right && arr[right] > piovt) right--;
            if (left < right) swap(arr, left, right);
        }
        swap(arr,left,rightBound);
        return left;
    }

    static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    static void print(int[] arr){
        for (int i=0; i<arr.length; i++)
            System.out.print(arr[i] + " ");
    }
}

双轴快排(Dual Pivot Quicksort)

Array.sort流程图:

  • TimSort
  • 双插入排序(pair insertion sort)
  • 荷兰国旗问题 (Dutch National Flag)

7.计数排序

import java.util.Arrays;

public class Count {
    public static void main(String[] args){
        int[] arr = {2, 4, 2, 3, 7, 1, 1, 0, 0, 5, 6, 9, 8, 5, 7, 4, 0, 9};
        int[] result = sort(arr);
        System.out.print(Arrays.toString(result));
    }

    public static int[] sort(int[] arr){
        int[] result = new int[arr.length];
        int[] count = new int[10];

        for (int i=0; i<arr.length; i++)
            count[arr[i]]++;

        System.out.println(Arrays.toString(count));

        for (int i=1; i<count.length;i++)
            count[i] = count[i] + count[i-1];

        System.out.println(Arrays.toString(count));

        for (int i=arr.length-1; i>=0; i--)
            result[--count[arr[i]]] = arr[i];

        return result;
    }

}

验证测试类:

import com.gemini.sort.Count;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Random;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CountSortTest {
    int[] generateRandomArray(){
        Random r = new Random();
        int[] arr = new int[10000];

        for (int i=0; i<arr.length; i++){
            arr[i] = r.nextInt(10);
        }

        return arr;
    }

    @Test
    void testSort(){
        int[] a = generateRandomArray();
        int[] result = Count.sort(a);
        Arrays.sort(a);
        boolean same = true;

        for (int i=0; i<a.length; i++){
            if (result[i] != a[i]) same = false;
        }

        assertEquals(true,same);

    }
}

8.基数排序

import java.util.Arrays;

public class Radix {
    public static void main(String[] args) {
        int[] arr = {421,240,115,532,305,430,124};
        int maxPos = findMaxPosition(arr);
        sort(arr,maxPos);
        System.out.println(Arrays.toString(arr));
    }

    public static void sort(int[] arr,int maxPos) {
        int[] result = new int[arr.length];
        int[] count = new int[10];

        for (int i=0; i<maxPos; i++){
            int division = (int)Math.pow(10,i);
            System.out.println(division);

            for (int j=0; j<arr.length; j++){
                count[arr[j] / division % 10]++;
            }
            System.out.println(Arrays.toString(count));

            for (int m=1; m<count.length; m++){
                count[m] = count[m] + count[m-1];
            }
            System.out.println(Arrays.toString(count));

            for (int n=arr.length-1; n>=0; n--){
                int num = arr[n]/division % 10;
                result[--count[num]] = arr[n];
            }
            //将result数组内容复制到arr数组
            System.arraycopy(result, 0, arr, 0, arr.length);
            //将count数组去全部置零
            Arrays.fill(count, 0);
        }

    }

    static int findMaxPosition(int[] arr) {
        int Max = 0;
        int MaxPos = 0;
        for (int i=0; i<arr.length-1; i++){
            Max = Math.max(arr[i], arr[i + 1]);
        }
        while (Max != 0 ){
            Max = Max / 10;
            MaxPos++;
        }
        return MaxPos;
    }

}

9.桶排序

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以通过直接插入排序、希尔排序和堆排序来实现排序算法。 直接插入排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class InsertSortDemo { public static void insertSort(int[] arr) { for (int i = 1; i < arr.length; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j > key) { arr[j + 1 = arr[j]; j--; } arr[j + 1 = key; } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); insertSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 希尔排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class ShellSortDemo { public static void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { int key = arr[i]; int j = i; while (j >= gap && arr[j - gap > key) { arr[j = arr[j - gap]; j -= gap; } arr[j = key; } } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); shellSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 堆排序的Java实现可以参考以下代码: ```java import java.util.Arrays; public class HeapSortDemo { public static void heapSort(int[] arr) { int n = arr.length; // 构建大顶堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 依次将堆顶元素与末尾元素交换,并重新构建堆 for (int i = n - 1; i > 0; i--) { int temp = arr = arr[i]; arr[i = temp; heapify(arr, i, 0); } } public static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left > arr[largest]) { largest = left; } if (right < n && arr[right > arr[largest]) { largest = right; } if (largest != i) { int temp = arr[i]; arr[i = arr[largest]; arr[largest = temp; heapify(arr, n, largest); } } public static void main(String[] args) { int[] arrTest = {0, 1, 5, 8, 3, 7, 4, 6, 2}; System.out.println("before: " + Arrays.toString(arrTest)); heapSort(arrTest); System.out.println("after: " + Arrays.toString(arrTest)); } } ``` 以上是三种常见排序算法Java实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [java实现七种经典排序算法](https://blog.csdn.net/qq_27498287/article/details/126049089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值