Java 常用排序算法实现

2013-11-14 veryyoung 更多博文 » 博客 » GitHub »

原文链接 http://veryyoung.me/blog/2013/11/14/common-sort-algorithm-in-java.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


public class ArrayOperation {


        /** 归并排序,ints为要进行排序的数组,temp为临时数组,start为排序起点,end为排序终点,排序范围为[start,end] */ 
        private static void guibingSort(int[] ints, int[] temp, int start, int end) {
        if(start >= end)
          return;
        int middle = (start + end) / 2;//中间点
        int left = start;//左边起点
        int right = middle + 1;//右边起点
        mergeSort(ints, temp, left, middle);//左边排序
        mergeSort(ints, temp, right, end);//右边排序
        //将两边的数组进行合并
        int i;
        for(i = start;  left <=  middle && right <= end;) {
              if(ints[left] > ints[right])
                 temp[i++] = ints[right++];
              else
                 temp[i++] = ints[left++];
               }
              //将左边没有合并完的添加到temp中
              while(left <= middle)
              temp[i++] = ints[left++];
              //将右边没有合并完的添加到temp中
              while(right <= end)
              temp[i++] = ints[right++];
              //最后将这些数字转回到ints
              System.arraycopy(temp, start, ints, start, end - start + 1);
        }

    // 快速排序

    public static void quickSort(int a[], int left, int right) {
        int i, j, temp;
        i = left;
        j = right;
        if (left > right)
            return;
        temp = a[left];
        while (i != j)/* 找到最终位置 */
        {
            while (a[j] >= temp && j > i)
                j--;
            if (j > i)
                a[i++] = a[j];
            while (a[i] <= temp && j > i)
                i++;
            if (j > i)
                a[j--] = a[i];

        }
        a[i] = temp;
        quickSort(a, left, i - 1);/* 递归左边 */
        quickSort(a, i + 1, right);/* 递归右边 */
    }

    // 插入排序
    // 特点:用temp保存将要排序的临时值,然后把大的值插入到这个位置。
    public static int[] insert_Sort(int[] array) {
        int i, j, temp;
        for (i = 1; i < array.length; i++) {
            for (j = i, temp = array[i]; j > 0 && temp < array[j - 1]; j--)
                array[j] = array[j - 1];
            array[j] = temp;
        }
        return array;
    }

    // 冒泡排序
    // 特点:从第一个元素开始,如果需要交换,就一直冒泡到底,如果不需要交换,就从下一个元素开始比较
    public void bubble_Sort(int[] array, int size) {
        int i, j, temp;
        for (i = size - 1; i > 1; i--)
            for (j = 0; j < i; j++)
                if (array[j] > array[j + 1]) {
                    temp = array[j + 1];
                    array[j + 1] = array[j];
                    array[j] = temp;
                }
    }

    // 交换排序
    // 特点:始终是第一个元素与其他元素一一比较,交互后,继续用第一个元素与后面元素一一比较,重复下去。
    public int[] change_Sort(int[] array, int size) {
        int i, j, temp;
        for (i = 0; i < size; i++)
            for (j = i + 1; j < size; j++)
                if (array[i] > array[j]) {
                    temp = array[j];
                    array[j] = array[i];
                    array[i] = temp;
                }
        return array;
    }

    // 选择排序一(便于区分:咱就叫:选择最小值排序法)
    // 特点:分有序区(第一个元素)和无序区(除第一元素外的元素),从无序区找出最小的元素移动到有序区
    public void SelectSort(int[] array) {
        int i, j, k;// 分别为有序区,无序区,无序区最小元素指针
        for (i = 0; i < array.length; i++) {
            k = i;
            for (j = i + 1; j < array.length; j++) {
                if (array[j] < array[k])
                    k = j;
            }
            if (k != i)// 若发现最小元素,则移动到有序区
            {
                int temp = array[k];
                array[k] = array[i];
                array[i] = array[temp];
            }
        }
    }


    // 希尔排序
    // 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序
    // 排序过程:先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;
    // 然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止
    public static void ShellSort(int[] array) {
        int length = array.length;
        for (int h = length / 2; h > 0; h = h / 2) {
            // here is insert sort
            for (int i = h; i < length; i++) {
                int temp = array[i];
                if (temp < array[i - h]) {
                    for (int j = 0; j < i; j += h) {
                        if (temp < array[j]) {
                            temp = array[j];
                            array[j] = array[i];
                            array[i] = temp;
                        }
                    }
                }
            }
        }
    }
}