算法从写出最简单的快排开始找到自信

本篇是我开始写算法点滴的开篇,这里不对任何算法作详细和理论的分析,目的只有一个:“默写”出最简单的快排,找回学算法的自信。

谈快排前还是先写写冒泡:

public class BubbleSort {
    public static int[]arr = {1, 2, 6, 5, 3, 45, 32, 23};

    public static void main(String[] args) {
        bubbleSort(arr);
        output(arr);
    }

    public static void bubbleSort(int[] arr){
        int n = arr.length;
        boolean change = true;
        for (int i = 0; i < n && change; ++i){
            change = false;
            for (int j = 0; j < n-i-1; ++j){
                if (arr[j] > arr[j+1]){
                    swap(arr, j, j+1);
                    change = true;
                }
            }
        }
    }

    public  static void swap(int[] arr, int i, int j){
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void output(int[] arr){
        for (int i = 0; i < arr.length; ++i){
            System.out.print(arr[i] + " ");
        }
    }
}
public class COME_ON {  
    public static void main(String[] args) {
        quickSort(arr, 0, 7);
        output(arr);
    }
    public static int[]arr = {7, 2, 6, 5, 3, 45, 32, 23};
    // 递归快排
    public static void quickSort(int[] arr, int left, int right){
        if (left < right){
            int pos = partion_pos(arr, left, right);
            quickSort(arr, left, pos-1);
            quickSort(arr, pos+1, right);
        }
    }
    // 划分
    public static int partion_pos(int[] arr, int left, int right) {
        int posKey = arr[left];
        while (left < right){// 当左右指针不重合时
            while (left < right){// 从后往前找比基准小的换到前面。该循环保证指针的逐渐移动
                if (arr[right] > posKey) right--;
                else break;
            }
            arr[left] = arr[right];// 把右端比基准小的元素放到left处
            while (left < right){// 从前往后找比基准大的换到后面
                if (arr[left] < posKey) left++;
                else break;
            }
            arr[right] = arr[left];// 把左端比基准大的元素放到right处
        }
        arr[left] = posKey; 
        return left;
    }
    public static void output(int[] arr){
        for (int i = 0; i < arr.length; ++i){
            System.out.print(arr[i] + " ");
        }
    }
}

以上快排未对划分作任何优化处理,接下来的某一篇将会从时间复杂度,空间复杂度,稳定性等方面对内部排序(插入类、交换类、选择类、基排、二路归并)做系统地分析与处理。

由于一般的内部排序都是基于比较和移动的,这里附带上常见的三种交换方法,仅针对整数。

/** * 交换数组中整数的常见交换方法 * @author FanFF * */
public class SwapUtils {
    // 利用变量
    public static void swap1(int arr[], int i , int j){
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }   
    // 加减法实现
    public static void swap2(int arr[], int i, int j){
        arr[i] = arr[i] + arr[j];// 两数和
        arr[j] = arr[i] - arr[j];// 和减去一个数等于另一个数
        arr[i] = arr[i] - arr[j];// 和减去另一个数等于一个数
    }   
    // 位运算
    public static void swap3(int arr[], int i, int j){
        // 类比加减法
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
}

你可能感兴趣的:(算法,快排)