排序算法 java实现2

继续排序算法

4.冒泡排序

从第一个开始,跟后面一个数比较,如果比后面大就交换位置,这样没完成一轮,就可以把最大的选出来

    public static <T extends Comparable<T>> T[] genericBubbleSort(T[] a) {

        int n = a.length;

        for (int i = 0; i < n - 1; i++) {

            for (int j = 0; j < n - i - 1; j++) {

                if (a[j].compareTo(a[j + 1]) > 0) {

                    T temp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

        }

        return a;

    }

改进上面的冒泡排序

方案一:设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,

故在进行下一趟排序时只要扫描到pos位置即可

    public static <T extends Comparable<T>> T[] genericBubbleSortGai(T[] a) {

        int n = a.length;

        int i = n - 1;

        while (i > 0) {

            int pos = 0;

            for (int j = 0; j < i; j++) {

                if (a[j].compareTo(a[j + 1]) > 0) {

                    pos = j;

                    T temp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

            i = pos;

        }

        return a;

    }

改进方案二:

两边同时进行  先找最大的  然后找最小的

    public static <T extends Comparable<T>> T[] genericBubbleSortGai2(T[] a) {

        int n = a.length;

        int low = 0, high = n - 1;

        int j;

        T tmp;

        while (low < high) {

            for (j = low; j < high; j++) {

                if (a[j].compareTo(a[j + 1]) > 0) {

                    tmp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = tmp;

                }

            }

            high--;

            for (j = high; j > low; j--) {

                if (a[j].compareTo(a[j - 1]) < 0) {

                    tmp = a[j];

                    a[j] = a[j - 1];

                    a[j - 1] = tmp;

                }

            }

            low++;

        }

        return a;

    }

改进方案三:

设置一个标志  如果有一趟没有发生交换  则排序完成

    public static <T extends Comparable<T>> T[] genericbubblesortgai3(T[] a) {

        int n = a.length;

        boolean flag = true;

        for (int i = 0; i < n - 1; i++) {

            if (!flag) {

                return a;

            }

            flag = false;

            for (int j = 0; j < n - i - 1; j++) {

                if (a[j].compareTo(a[j + 1]) > 0) {

                    flag = true;

                    T temp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }



        }

        return a;

    }

5.快速排序

<快速排序> 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序是一种不稳定的排序算法

    public static <T extends Comparable<T>> T[] QuickSortStart(T[] list) {

        quickSort(list, 0, list.length - 1);

        return list;

    }



    private static <T extends Comparable<T>> void quickSort(T[] list,

            int first, int last) {

        if (last > first) {

            int povitIndex = partition(list, first, last);

            quickSort(list, first, povitIndex - 1);

            quickSort(list, povitIndex + 1, last);

        }

    }



    private static <T extends Comparable<T>> int partition(T[] list, int first,

            int last) {

        /*

         * 把数组分为两组,将比povit小的数放在它前面,比povit大的数放在它后面

         */

        T povit = list[first];

        int low = first + 1;

        int high = last;



        while (high > low) {

            while (high > low && list[low].compareTo(povit) <= 0)

                low++;

            while (low <= high && list[high].compareTo(povit) > 0)

                high--;

            if (high > low) {

                T temp = list[high];

                list[high] = list[low];

                list[low] = temp;

            }

        }

        while (high > first && list[high].compareTo(povit) >= 0)

            high--;

        if (povit.compareTo(list[high]) > 0) {

            list[first] = list[high];

            list[high] = povit;

            return high;

        }

        return first;

    }

6.归并排序

将一个序列一直对半拆分,知道不能拆分,然后开始归并,归并采用插入排序

    public static <T extends Comparable<T>> T[] mergesort(T[] a) {

        T[] temp = a.clone();

        a = msort(a, temp, 0, a.length);

        return a;

    }



    public static <T extends Comparable<T>> T[] msort(T[] a, T[] temp,

            int first, int last) {

        if (first + 1 < last) {

            int mid = (first + last) / 2;

            msort(a, temp, first, mid);

            msort(a, temp, mid, last);



            int index1 = first;

            int index2 = mid;

            int index3 = first;

            while (index1 < mid && index2 < last) {

                if (a[index1].compareTo(a[index2]) < 0) {

                    temp[index3] = a[index1];

                    index1++;

                } else {

                    temp[index3] = a[index2];

                    index2++;

                }

                index3++;

            }

            while (index1 < mid) {

                temp[index3++] = a[index1++];

            }

            while (index2 < last) {

                temp[index3++] = a[index2++];

            }

            for (int i = first; i < last; i++)

                a[i] = temp[i];



        }

        return a;

    }

感觉就是把代码复制上去了,说的不是很清楚,,,还有一个堆排序没有写

 

最后对上面的排序算法做了下测试,生成10000个int数,进行排序,算时间

1.归并排序  50~60 ms之间

2.简单选择排序 135~155 ms之间

3.选择排序 220 ms    //可能是我数据没选好,10000个数,生成的随机数也是0~10000

4.快速排序  30ms  左右

5.冒泡排序 改进方案二快点  280ms

6.插入排序  70ms左右

 

然后还是10000个随机数,范围换成0~100000,结果基本每种排序的时间更短

所以排序的时间长短是和数据本身有关系的

你可能感兴趣的:(java实现)