Java & Js & Python 快速排序

Java & Js & Python 快速排序(2020年8月31日)


学习背景

大二上学期刚开学,学习了一点算法。参考着《数据解构》上C语言版的快速排序算法,经过理解记忆和练习,默写java、js、python版的快速排序。

源代码

Java

import java.util.Arrays;
public class test {
    public static void main(String[] args){
        int[] arr = {1, 3, 4, 2, 1, 3, 4, 2, 1, 3, 1, 2};
        quickSortArray(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 对数组进行快速排序
     *
     */
    public static void quickSortArray(int[] array){
        //调用递归函数
        quickSort(array, 0, array.length - 1);
    }
    
    public static void quickSort(int[] array, int low, int high){
        if(low < high){
            int sign = parting(array, low, high);
            quickSort(array, low, sign - 1);
            quickSort(array, sign + 1, high);
        }
    }

    private static int parting(int[] array, int low, int high){
        int swapNum = low;
        for(int i = low; i < high; i++){
            System.out.println(i);
            if(array[i] < array[high]){
                swap(array, i, swapNum);
                swapNum++;
            }
        }
        swap(array, swapNum, high);
        return swapNum;
    }

    // 交换两个变量的值
    private static void swap(int[] array, int a, int b){
        int c = array[a];
        array[a] = array[b];
        array[b] = c;
    }
}

JavaScript

//交换数组中的两个变量
function swap(array, a, b){
    var c;
    c = array[a];
    array[a] = array[b];
    array[b] = c;
}
//快速排序
function quicklySort(array, low, high){
    if(low < high){
        var sign = partly(array, low, high);
        quicklySort(array, low, sign - 1);
        quicklySort(array, sign + 1, high);
    }
}

//快速排序中的分割函数
function partly(array, low, high){
    var i = low;
    for(var j = low; j < high; j ++){
        if (array[j] < array[high]){
            //array[i], array[j] = array[j], array[i];
            swap(array, i, j);
            i++;
        }
    }
    //array[i], array[high] = array[high], array[i];
    swap(array, i, high);
    return i;
}
//打印数组
function printArray(array){
    for(var i = 0; i < array.length; i++){
        document.write("<p>");
        document.write(array[i]);
        document.write("</p>");
    }
}

var a = new Array();
//在数组里添加很多随机数
for(var i = 0; i< 100; i++){
    a.push(Math.random());
}
document.write("<h1>");
document.write("排序前的数组");
document.write("</h1>");

printArray(a);

document.write("<h1>");
document.write("排序后的数组");
document.write("</h1>");

quicklySort(a, 0, a.length - 1);
printArray(a);

Python

def partition(array, low, high):
    """
    快速排序中用到的分割函数:
    重新排序数列,所有比基准值小的元素摆放在基准前面,
    所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。
    在这个分割结束之后,对基准值的排序就已经完成;
    @:param array 传入的数组,一小段
    @:param low 最小索引
    @:param high 最大索引
    @:return 一步分割后的基准值下标
    """
    i = low  # 最小元素索引
    # j 遍历 [low, high),high 是基准值的下标,所以不包含 high
    for j in range(low, high):
        # 当元素小于或者等于基准值 array[high]
        if array[j] < array[high]:
            # 交换下标 i 和 j 的位置
            if i != j:
                array[i], array[j] = array[j], array[i]
            i += 1
    # 交换位置
    array[i], array[high] = array[high], array[i]
    return i


def quick_sort(array, low, high):
    """
    快速排序
    该函数直接修改了数组的状态
    :param array: 排序数组
    :param low: 起始索引
    :param high: 结束索引
    """
    if low <= high:
        pi = partition(array, low, high)
        quick_sort(array, low, pi - 1)  # 对前半部分排序
        quick_sort(array, pi + 1, high)  # 对后半部分排序


if __name__ == '__main__':
    arrayList = []
    for num in range(100000):
        arrayList.append(uniform(0, 100))

    t1 = time()
    quick_sort(arrayList, 0, len(arrayList) - 1)
    t2 = time()
    print(t2 - t1)
    pass
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。