Java实现常用的排序算法

这篇博客主要介绍了如何用Java实现两种经典的排序算法——冒泡排序和插入排序,详细解析了各自的实现过程。

常见排序算法(Java版)

1.冒泡排序

复制代码
package Sort;

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int [] a =  {6, 3, 7, 2, 4, 9, 5, 8};
        bubbleSort(a);
        for (int i=0;i<A.length-1;i++) {
            System.out.print(A[i]);
        }        
        System.out.println();
    }
    public static int[] bubbleSort(int[] A) 
        for (int i=0;i<A.length-1;i++){
            for (int j=i+1;j<A.length;j++){
                if (A[i] > A[j]){
                    int tmp = A[i];
                    A[i] = A[j];
                    A[j] = tmp;
                }
            }
        }

    return A;
    }
}

3.插入排序

复制代码
package Sort;

public class InsertionSort {
    public int[] insertionSort(int[] A, int n) {
        int i, j, temp;

        for(i = 1; i < n; i++){
            temp = A[i];
            //循环遍历已经排好序的部分,找出大于待排序数字的数字,交换位置
            for(j = i; j > 0 && A[j - 1] > temp; j-- ){
                A[j] = A[j - 1];
            }
            A[j] = temp;
        }

        return A;
    }
}

4.选择排序

复制代码
package Sort;
//选择排序的主要思想是每次都从待排序的部分中找出最小的一个放到它应该在的位置,如最小的数字应该放在最左边。
public class SelectionSort {
    public int[] selectionSort(int[] A, int n) {
        // write code here
        for (int i = 0; i < n - 1; i++) {
            int index = i;
            int j;
            // 找出最小值得元素下标
            for (j = i + 1; j < n; j++) {
                if (A[j] < A[index]) {
                    index = j;
                }
            }
            int tmp = A[index];
            A[index] = A[i];
            A[i] = tmp;
        }
        return A;
    }
}

5. 归并排序

复制代码
package Sort;

public class MergeSort {

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

        }
    }

    public static int[] mergeSort(int[] A, int n) {
        // write code here
        sort(A, 0, n - 1);
        return A;
    }

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

    public static void merge(int[] A, int left, int mid, int right) {
        // 临时数组

        int n = right - left + 1;
        int[] tmpArr = new int[n];
        int l = left;
        int r = mid + 1;
        int t = 0;// 临时数组下标元素

        // 比较两子序列元素的大小
        while (l <= mid && r <= right) {
            if (A[l] < A[r]) {
                tmpArr[t++] = A[l++];
            } else {
                tmpArr[t++] = A[r++];
            }
        }

        // 剩余的加入临时数组
        while (l <= mid) {
            tmpArr[t++] = A[l++];
        }
        // 剩余的加入临时数组
        while (r <= right) {
            tmpArr[t++] = A[r++];
        }

        // 把临时数组元素放回原数组
        for (int i = 0; i < t; i++) {
            A[left + i] = tmpArr[i];
        }

    }
}

2.快速排序

复制代码
package Sort;

import java.util.Arrays;

public class QuickSort {

    public static void main(String[] args) {
        int A[] = {6, 3, 7, 2, 4, 9, 5, 8 };
        quickSort(A, 0, 7);
        System.out.println(Arrays.toString(A));
    }

    public static void quickSort(int[] A, int left, int right) {

        if (left < right) {
            // 一次划分
            int mid = partion(A, left, right);
            quickSort(A, 0, mid - 1);
            quickSort(A, mid + 1, right);
        }
    }

    public static void swap(int[] A, int l, int r) {
        int tmp = A[l];
        A[l] = A[r];
        A[r] = tmp;

    }

    public static int partion(int[] a, int left, int right) {
        // 轴值,默认选取数组的第一个数字
        while (left < right) {
            while (left < right && a[left] <= a[right]) {
                right--;
            }
            if (left<right){
                swap(a, left, right);
            }
            while (left < right && a[left] <= a[right]) {
                left++;
            }
            if (left<right){
                swap(a, left, right);
            }
        }
        return left;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值