快速排序--c++/javascript/python实现

快速排序的基本实现:

快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:

1、从数列中取出一个数作为基准数(枢轴,pivot)。

2、将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数的元素都移至枢轴左边。

3、再对左右的子区间重复第二步的划分操作,直至每个子区间只有一个元素。

快排最重要的一步就是划分了。划分的过程用通俗的语言讲就是“挖坑”和“填坑”。

快速排序时间复杂度:

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。
(01) 为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。

因此,快速排序的遍历次数最少是lg(N+1)次。
(02) 为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

快速排序稳定性:

快速排序是不稳定的算法,它不满足稳定算法的定义。

算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

c++ 实现:

#include <iostream>
using namespace std;

void quickSort(int arr[], int left, int right)
{
    int i = left;
    int j = right; 
    if(i<j)
    {
    	int temp = arr[i];
        while(i<j)
        {
            while(i<j && temp<arr[j])
            {
                j--;
            }
            if(i<j)
            {
                arr[i] = arr[j];
                i++;
            }
            while(i<j && temp>=arr[i])
            {
                i++;
            }
            if(i<j)
            {
                arr[j] = arr[i];
                j--;
            }

        }
        arr[i] = temp;
        quickSort(arr, left, i-1);
        quickSort(arr, i+1, right);
    }

}
int main() {
    int arr[10] = {2, 3, 1, 9, 8, 7, 0, 4, 6, 5};
    quickSort(arr, 0, 9);
    for(int i=0;i<10;i++)
    {
        cout<<i<<" ";
    }
    return 0;
}

c++实现结果:
在这里插入图片描述

python3 代码实现:(注意作用域问题)

def quick_sort(arr, left, right):
    i = left
    j = right
    
    if i < j:
        temp = arr[left]
        while i < j:
            while i < j and temp < arr[j]:
                j -= 1
            if i < j:
                arr[i] = arr[j]
                i += 1
            while i < j and temp >= arr[i]:
                i += 1
            if i < j:
                arr[j] = arr[i]
                j -= 1
        arr[i] = temp
        quick_sort(arr, left, i - 1)
        quick_sort(arr, i + 1, right)


if __name__ == '__main__':
    arr_list = [2, 3, 1, 9, 8, 7, 0, 4, 6, 5]
    quick_sort(arr_list, 0, len(arr_list) - 1)
    for k in arr_list:
        print(k)

python3实现结果:
在这里插入图片描述

javascript代码实现:

function quickSort(arr, left, right){
	let i = left
	let j = right
	
	if(i < j){
		let temp = arr[left]
		while(i < j){
			while(i < j && temp < arr[j]){
				j--
			}
			if(i < j){
				arr[i] = arr[j]
				i++;
			}
			while(i < j && temp >= arr[i]){
				i++
			}
			if(i < j){
				arr[j] = arr[i]
				j--
			}
		}
		arr[i] = temp
		quickSort(arr, left, i-1)
		quickSort(arr, i+1, right)
	}
}
let arr = [2, 3, 1, 9, 8, 7, 0, 4, 6, 5]
quickSort(arr, 0, 9)
arr.forEach(function(val, key){
	console.log(val)
})

javascript实现结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值