排序算法总结(快速排序)

终于不用改论文了,希望文章大修顺利!

基础知识

排序算法的稳定性: 排序后值相同的前后位置不变

稳定的算法:

  • 插入排序
  • 冒泡排序
  • 归并排序
  • 桶排序
  • 二叉树排序

不稳定的算法

  • 选择排序
  • 希尔排序
  • 堆排序
  • 快速排序

内部排序:排序过程不涉及内、外存交换
外部排序:排序过程有内、外存交换

In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排序。
Out-place sort:归并排序、计数排序、基数排序、桶排序。


快速排序

unstable sort、In-place sort
时间复杂度-> O(n2) (当输入数组已排序时) O(nlogn)
“分而治之”的思想,一个序列中选一个值,把小于它的放左边,大于它的放右边。之后对左右两个子序列同样操作

代码:
C

#include <stdio.h>
#include <stdlib.h>

int main(){
    int a[] = {1,6,3,2,5};
    quick_sort(a,0,5);
    int i = 0;
    for(i = 0;i < 5; i++){
        printf("%d ", a[i]);
    }
    return 0;
}

void quick_sort(int s[], int l, int r){
    if (l < r)
    {
        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if(i < j)
                s[i++] = s[j];

            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if(i < j)
                s[j--] = s[i];
        }
        s[i] = x;
        quick_sort(s, l, i - 1); // 递归调用
        quick_sort(s, i + 1, r);
    }
}

Python

def quickSort(arr, left, right):
    if(left < right):
        print(arr)
        i, j = left, right
        if len(arr) <= 1:
            return
        flag = arr[left]

        while(left < right):
            while(left < right and arr[right] >= flag):
                right -= 1
            if(left < right):
                arr[left] = arr[right]
                left += 1
            while(left < right and arr[left] < flag):
                left += 1
            if(left < right):
                arr[right] = arr[left]
                right -= 1
        arr[right] = flag
        print(left, right, arr)
        quickSort(arr, i, right - 1)
        quickSort(arr, right + 1, j)

注意不能用切片的,因为切片传递的不是指针,切片是浅拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值