# 排序算法

# 冒泡排序法

# 选择排序法

思路: 选择一个元素作为最小元素(一般是第一个),然后将这个元素与数组其他元素进行比较,如果比它还小则将其最小元素赋值给它,比较完一轮后,将这个最小元素放入到新数组(排序好的数组)并从原数组剔除出去,如此反复操作 n 轮

** 时间复杂度:**O (n²)

代码:

java :

/**
     * 寻找最小元素
     * @param arr 数组
     * @return 最小元素索引
     */
    public static int findSmallest(int []arr){
        int smallest = arr[0];
        int smallest_index = 0 ;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < smallest){
                smallest = arr[i];
                smallest_index = i ;
            }
        }
        return smallest_index;
    }
    /**
     * 返回去除元素的新数组
     * @param arr 原数组
     * @param element_index 最小元素索引
     * @return 新数组
     */
    public static int[] removeElement(int arr[],int element_index){
        int []array = new int[arr.length - 1];
        for(int i = 0 ,j =0;i<arr.length;i++){
            if (i!=element_index){
                array[j++] = arr[i];
            }
        }
        return array;
    }
    /**
     * 选择排序算法
     * @param arr 原数组
     * @return 排序好的新数组
     */
    public static int [] chooseSort(int arr[]){
        int []newArr = new int[arr.length];
        int index = 0 ;
        int len = arr.length ;
        for (int i = 0; i < len; i++) {
            int smallest_index = findSmallest(arr);
            newArr[index++] = arr[smallest_index];
            arr = removeElement(arr,smallest_index);
        }
        return newArr;
    }

python :

# 寻找最小元素,并返回最小元素索引
def find_smallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index
# 选择排序法
def choose_sort(arr):
    sort_list = []
    for i in range(len(arr)):
        smallest_index = find_smallest(arr)
        sort_list.append(arr.pop(smallest_index))
    return sort_list

# 快速排序法

** 思路:** 选择数组中的一个元素作为基准元素,然后将其他元素与其比较,如果小的放入左边一个数组,如果大的放入右边的数组,反复操作,直至子数组只有 0 个或者 1 个元素为止。

时间复杂度:O (nlogn)

python :

# 快速排序法
# 思路:选择数组中的一个元素作为基准元素,然后将其他元素与其比较,如果小的放入左边一个数组,如果大的放入右边的数组,反复操作,直至子数组只有 0 个或者 1 个元素为止
# 这种思路可以使用递归的方式来做,将数组只有 0 个或者 1 个元素作为递归终止条件,后面再做归纳 --- 选择基准元素和子数组递归。
# 快速排序法
def quick_sort(arr):
    # 如果数组长度小于 2,则直接返回数组
    if len(arr) < 2:
        return arr
    # 将数组第一个元素作为基准元素
    pivot = arr[0]
    # 生成小于等于基准元素的子数组
    less = [i for i in arr[1:] if i <= pivot]
    # 生成大于基准元素的子数组
    right = [i for i in arr[1:] if i > pivot]
    # 合并数组
    return quick_sort(less) + [pivot] + quick_sort(right)
print(quick_sort([2, 7, 7, 4, 1, 9, 5, 3, 6, 8]))

java:

/**
     * 快速排序法
     * @param arr 原数组
     * @return
     */
    public static int [] quickSort(int []arr){
        // 如果数组长度小于等于 1,直接返回 基准条件
        if (arr.length <= 1){
            return arr;
        }
        // 取第一个元素作为基准元素
        int privot = arr[0];
        // 获取比基准元素小和比基准元素大的数组
        ArrayList<Integer> less = new ArrayList<>();
        ArrayList<Integer> greater = new ArrayList<>();
        for (int i = 1; i < arr.length ; i++) {
            if (arr[i] >= privot) {
                greater.add(arr[i]);
            }else {
                less.add(arr[i]);
            }
        }
        // 递归上述行为,直至获取到两个数组排序好的数组
        int[] lessArr = quickSort(less.stream().mapToInt(Integer::valueOf).toArray());
        int[] greaterArr = quickSort(greater.stream().mapToInt(Integer::valueOf).toArray());
        int []array = new int[arr.length];
        // 将其复制到新数组中
        System.arraycopy(lessArr,0,array,0,lessArr.length);
        System.arraycopy(greaterArr,0,array,lessArr.length+1,greaterArr.length);
        array[lessArr.length] = privot ;
        return array ;
    }