常见排序算法(Java实现)

常见排序算法实现。


import java.util.Arrays;

/**
 * 
 * @ClassName: SortAlgorithms
 *
 * @Description: 常见的排序算法 java 实现
 * void bubbleSort(T[]) 冒泡排序
 * void insertSort(T[]) 插入排序
 * void selectSort(T[]) 选择排序
 * void shellSort(T[]) 希尔排序
 * void mergeSort(T[]) 归并排序
 * void quickSort(T[]) 快速排序
 * void heapSort(T[]) 堆排序
 * @author: ccding
 * @date: 2016年10月26日 上午10:50:55
 *
 * @param <T> 待排序元素的类型
 */
public class SortAlgorithms <T extends Comparable<T>> {
    public void bubbleSort(T[] nums){
        T tmp;
        for(int i=0; i<nums.length; i++){
            for(int j=i+1; j<nums.length; j++){
                if(nums[j].compareTo(nums[i]) < 0){
                    tmp = nums[j];
                    nums[j] = nums[i];
                    nums[i] = tmp;
                }
            }
        }
    }

    public void insertSort(T[] nums){
        T tmp;
        for(int i=1; i<nums.length; i++){
            tmp = nums[i];
            int j = i-1;
            while(j>=0 && tmp.compareTo(nums[j]) < 0){
                nums[j+1] = nums[j];
                j--;
            }
            nums[j+1] = tmp;
        }
    }

    public void selectSort(T[] nums){
        T tmp;
        int minIndex;
        for(int i=0; i<nums.length; i++){
            minIndex = this.getMinIndex(nums, i);
            tmp = nums[minIndex];
            nums[minIndex] = nums[i];
            nums[i] = tmp;
        }


    }
    private int getMinIndex(T[] nums, int startIndex){
        T minValue = nums[startIndex];
        int minIndex = startIndex;
        for(int i=startIndex; i<nums.length; i++){
            if(minValue.compareTo(nums[i]) > 0){
                minValue = nums[i];
                minIndex = i;
            }
        }
        return minIndex;
    }

    public void shellSort(T[] nums){
        int gap = nums.length >> 1;
        T tmp;
        while(gap >= 1){
            for(int i=gap; i<nums.length; i++){
                if(nums[i].compareTo(nums[i-gap]) < 0){
                    tmp = nums[i];
                    int j = i-gap;
                    while( j>=0 && tmp.compareTo(nums[j])<0){
                        nums[j+gap] = nums[j];
                        j -= gap;
                    }
                    nums[j+gap] = tmp;
                }
            }
            gap = gap >> 1;
        }
    }

    public void mergeSort(T[] nums){
        mergeSort(nums, 0, nums.length-1);
    }
    private void mergeSort(T[] nums, int startIndex, int endIndex){
        if(endIndex > startIndex){
            int midIndex = (endIndex+startIndex) >> 1;
            mergeSort(nums, startIndex, midIndex);
            mergeSort(nums, midIndex+1, endIndex);
            merge(nums, startIndex, midIndex, endIndex);
        }
    }
    private void merge(T[] nums, int s, int m, int e){
        T[] sub1 = Arrays.copyOfRange(nums, s, m+1);
        T[] sub2 = Arrays.copyOfRange(nums, m+1, e+1);
        int idx1 = 0, idx2 = 0;
        int k=s;
        while(idx1<sub1.length && idx2<sub2.length){
            if(sub1[idx1].compareTo(sub2[idx2]) < 0){
                nums[k++] = sub1[idx1++];
            }else{
                nums[k++] = sub2[idx2++];
            }
        }
        while(idx1<sub1.length){
            nums[k++] = sub1[idx1++];
        }
        while(idx2<sub2.length){
            nums[k++] = sub2[idx2++];
        }
    }

    public void quickSort(T[] nums){
        quickSort(nums, 0, nums.length-1);
    }
    private void quickSort(T[] nums, int s, int t){
        if(s < t){
            int mid = partition(nums, s, t);
            quickSort(nums, s, mid-1);
            quickSort(nums, mid+1, t);
        }
    }
    private int partition(T[] nums, int s, int t){
        int randomIdx = (int)((t-s) * Math.random())+s;
        T e = nums[randomIdx];
        exchange(nums, randomIdx, t);
        while(s < t){
            while(s<t && nums[s].compareTo(e) <= 0)
                s++;
            nums[t] = nums[s];
            while(s<t && nums[t].compareTo(e) >= 0)
                t--;
            nums[s] = nums[t];
        }
        nums[s] = e;
        return s;
    }

    public void heapSort(T[] nums){
        buildMinHeap(nums);
        int heapSize = nums.length;
        for(int i=nums.length-1; i>=0; i--){
            exchange(nums, i, 0);
            heapify(nums, 0, --heapSize);
        }
    }
    private void buildMinHeap(T[] nums){
        for(int i= nums.length>>1; i>=0; i--){
            heapify(nums, i, nums.length);
        }
    }
    private void heapify(T[] nums, int i, int heapSize){
        int l = i<<1;
        int r = l+1;
        int large = i;
        if(l<heapSize && nums[l].compareTo(nums[large])<0){
            large = l;
        }
        if(r<heapSize && nums[r].compareTo(nums[large])<0){
            large = r;
        }
        if(large != i){
            exchange(nums, large, i);
            heapify(nums, large, heapSize);
        }
    }

    private void exchange(T[] nums, int i, int j){
        T tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
常见排序算法有许多种,以下是一些常见排序算法Java实现示例: 1. 冒泡排序(Bubble Sort): ```java public void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换arr[j]和arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 2. 插入排序(Insertion Sort): ```java public void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } ``` 3. 选择排序(Selection Sort): ```java public void selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n-1; i++) { int minIndex = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // 交换arr[i]和arr[minIndex] int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } } ``` 4. 快速排序(Quick Sort): ```java public void quickSort(int[] arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } private int partition(int[] arr, int low, int high) { int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; // 交换arr[i]和arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 交换arr[i+1]和arr[high] int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } ``` 这些只是一些常见排序算法的示例,还有其他排序算法,如归并排序、堆排序等。你可以根据需要选择适合的排序算法进行实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值