用java实现各种排序算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32250495/article/details/77069544

package Com.Sort;

/**
* 各种高级排序方法的实现
*
* @author Jane
*/
public class AdvanceSort {

// 打印数组
public static <T extends Comparable<? super T>> void print(T[] a) {
    for (T t : a) {
        System.out.print(t + " ");
    }
    System.out.println();
}

**// 希尔排序  亚次方的时间界O(N^3/2)**
public static <T extends Comparable<? super T>> void shellSort(T[] a) {
    int j;
    for (int gap = a.length / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < a.length; i++) {
            T tmp = a[i]; // 鎸夌収姣忎竴涓閲忔彃鍏ユ帓搴�
            for (j = i; j >= gap && tmp.compareTo(a[j - gap]) < 0; j -= gap)
                a[j] = a[j - gap];
            a[j] = tmp;
        }
    }
}

**// 归并排序,O(n)的辅助存储,O(nlogn)的时间界**
private static <T extends Comparable<? super T>> void mergeSort(T[] a, T[] temp, int left, int right) {
    if (left < right) {
        int center = (left + right) / 2;
        mergeSort(a, temp, left, center);
        mergeSort(a, temp, center + 1, right);
        merge(a, temp, left, center + 1, right);
    }
}

private static <T extends Comparable<? super T>> void merge(T[] a, T[] temp, int leftpos, int rightpos,
        int rightEnd) {
    int leftEnd = rightpos - 1;
    int tmpPos = leftpos;
    int numElements = rightEnd - leftpos + 1;

    while (leftpos <= leftEnd && rightpos <= rightEnd) {
        if (a[leftpos].compareTo(a[rightpos]) <= 0)
            temp[tmpPos++] = a[leftpos++];
        else
            temp[tmpPos++] = a[rightpos++];
    }

    while (leftpos <= leftEnd)
        temp[tmpPos++] = a[leftpos++];

    while (rightpos <= rightEnd)
        temp[tmpPos++] = a[rightpos++];

    for (int i = 0; i < numElements; i++, rightEnd--)
        a[rightEnd] = temp[rightEnd];

}

**// 归并排序 外部调用接口**
public static <T extends Comparable<? super T>> void mergeSort(T[] a) {
    T[] tmp = (T[]) new Comparable[a.length];
    mergeSort(a, tmp, 0, a.length - 1);
}

**// 堆排序 O(nlogn)可以不用辅存**
public static <T extends Comparable<? super T>> void heapSort(T[] a) {
    for (int i = a.length / 2; i >= 0; i--)
        percDown(a, i, a.length);

    for (int i = a.length - 1; i > 0; i--) {
        swapReference(a, 0, i);
        percDown(a, 0, i);
    }
}

// 下虑操作
private static <T extends Comparable<? super T>> void percDown(T[] a, int i, int n) {
    int child;
    T tmp;
    for (tmp = a[i]; 2 * i + 1 < n; i = child) {
        child = 2 * i + 1;
        if (child != n - 1 && a[child].compareTo(a[child + 1]) < 0)
            child++;
        if (tmp.compareTo(a[child]) < 0)
            a[i] = a[child];
        else
            break;
    }
    a[i] = tmp;
}

private static <T extends Comparable<? super T>> void swapReference(T[] a, int i, int n) {
    T tmp = a[n];
    a[n] = a[0];
    a[0] = tmp;
}

**// 快速排序,常见那种选择第一个作为pivot**
public static <T extends Comparable<? super T>> void quickSort(T[] a, int i, int j) {
    if ((j - i) <= 0)
        return;
    int left = i;
    int right = j;
    T tmp = a[left];
    while (i < j) {
        while (i < j && tmp.compareTo(a[j]) <= 0)
            j--;
        a[i] = a[j];
        while (i < j && tmp.compareTo(a[i]) >= 0)
            i++;
        a[j] = a[i];
    }
    a[i] = tmp;
    quickSort(a, left, i - 1);
    quickSort(a, i + 1, right);
}

**// 快速排序,选择三个试验点的中值作为pivot**
public static <T extends Comparable<? super T>> void quickSort2(T[] a, int left, int right) {
    if (right - left >= 4) {
        T pivot = median3(a, left, right);
        int i = left;
        int j = right - 1;
        for (;;) {
            while (a[++i].compareTo(pivot) < 0) {
            }
            while (a[--j].compareTo(pivot) > 0) {
            }
            if (i < j)
                swap(a, i, j);
            else
                break;
        }

        swap(a, i, right - 1);
        quickSort2(a, left, i - 1);
        quickSort2(a, i + 1, right);
    } else
        AdvanceSort.quickSort(a, left, right);
}

private static <T extends Comparable<? super T>> T median3(T[] a, int i, int j) {
    int center = (i + j) / 2;
    if (a[center].compareTo(a[i]) < 0)
        swap(a, center, i);
    if (a[j].compareTo(a[i]) < 0)
        swap(a, j, i);
    if (a[j].compareTo(a[center]) < 0)
        swap(a, j, center);

    swap(a, center, j - 1);
    return a[j - 1];
}

private static <T extends Comparable<? super T>> void swap(T[] a, int i, int j) {
    T tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

}

简单排序的实现

package Com.Sort;
/**
 * 
 * @author Jane
 */
public class SimpleSort {

    //打印数组
    public static  <T extends Comparable<? super T>> void print(T [] a)
    {
        for (T t : a) {
            System.out.print(t+" ");
        }
        System.out.println();
    }
    **//插入排序 O(n^2)**
    public static <T extends Comparable<? super T>> void insertSort(T [] a)
    {
        int j;
        for(int p=1;p<a.length;p++)
        {
            T tmp=a[p];
            for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
                a[j]=a[j-1];        
            a[j]=tmp;
        }
    }
    **//选择排序**
    public static <T extends Comparable<? super T>> void selectSort(T [] a)
    {
        for(int i=0;i<a.length-1;i++)
        {
            for(int j=i+1;j<a.length;j++)
            {
                if(a[j].compareTo(a[i])<0)
                {
                    T tmp=a[j];
                    a[j]=a[i];
                    a[i]=tmp;
                }
            }
        }
    }
    **//冒泡排序**
    public static <T extends Comparable<? super T>> void maoPaoSort(T [] a)
    {
        boolean flag=true;
        for(int i=a.length;i>0;i--)
        {
            for(int j=0;j<i-1;j++)
            {
                if(a[j+1].compareTo(a[j])<0)
                {
                    T tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                    flag=false;
                }
            }
            if(flag)
                break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32250495/article/details/77069544
今日推荐