排序算法(二)快速排序

快速排序基于分治思想,是在冒泡排序基础上的改进:记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。

 

快速排序是对冒泡排序的一种改进,是由C.A.R. Hoare于1962年提出的。

快速排序的平均时间性能很好,与插入排序不同,快速排序根据整个文件,把控制当前排序进程的基准关键字放到正确的位置上。

时间复杂度:平均情况下,O(NlogN);最坏情况:O(N2)

空间复杂度:O(NlogN)

稳定性:不稳定

// C: 快速排序
// left = 0; 
// right = listSize - 1;
void quicksort(int list[], int left, int right) {
    int pivot;
    int i, j;
    int temp = 0;
    if (left < right) {
        i = left;
        j = right + 1;
        pivot = list[left];

        //完成一次排序,即将数组中小于pivot的关键字放在左边,大于pivot的关键字放在右边
        do {
            do
                i++;
            while (list[i] < pivot);
            do
                j--;
            while (list[j] > pivot);
            if (i < j) {
                temp = list[i];
                list[i] = list[j];
                list[j] = temp;
                //SWAP(list[i], list[j]); //list[i]和list[j]互换
            }
        } while (i < j);

        temp = list[left];
        list[left] = list[j];
        list[j] = temp;
        //SWAP(list[left], list[j]);

        quicksort(list, left, j - 1);  // 对左半段进行排序;
        quicksort(list, j + 1, right);  // 对右半段进行排序;
    }
}

 

# Python 3: 快速排序
def quicksort(nums: list, left: int = None, right: int = None):
    left = 0 if left is None else left
    right = len(nums) - 1 if right is None else right
    if left < right:
        # 分区(partition)操作:对子数组进行原址重排,
        # 所有比基准元素值小的元素放在基准元素之前,
        # 所有比基准元素值大的元素放在基准元素之后(相同的数可以到任一边)。
        # 划分结束后,基准元素就处于数列的中间位置。
        partitionIndex = partition(nums, left, right)
        quicksort(nums, left, partitionIndex - 1)
        quicksort(nums, partitionIndex + 1, right)
    return nums


def partition(nums: list, left, right) -> int:
    pivot = left  # 设定基准值
    i = pivot + 1  # 设定索引
    j = i  # 设定遍历指针
    while j <= right:
        if nums[j] < nums[pivot]:  # 如果遍历到的数比基准值小,则将索引值与遍历到的数交换位置;
            swap(nums, j, i)
            i += 1
        j += 1
    swap(nums, pivot, i - 1)
    return i - 1


def swap(nums, i, j):
    nums[i], nums[j] = nums[j], nums[i]

 

 

posted @ 2021-05-09 22:50  vicky2021  阅读(261)  评论(0编辑  收藏  举报