快速排序整理

本文详细介绍了快速排序的基本思想和实现过程,包括如何选取基准元素、如何进行划分以及为何要在j减小而非i增加时进行交换。此外,文章还提供了一段C语言和Java的快速排序代码示例,帮助读者理解算法的细节。特别指出,当数组为非递减顺序且选取第一个元素为基准时,快速排序的时间复杂度可能达到最差情况的O(n^2)。
摘要由CSDN通过智能技术生成

快速排序思想:

在待排序的 n 个元素中任取一个元素(通常取第一个元素,也可随机选取)作为基准,把该元素放入适当位置后,数据序列被此元素划分成两部分。所有关键字比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分,并把该元素排在这两部分的中间(称为该元素归位),这个过程称为一趟快速排序,即一趟划分;
之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或者空为止。简而言之,每趟使序列的一个元素放入适当为止,将序列一分为二,对子序列按递归方式继续这种划分,直至划分的子序列的长位 1 或 0(递归出口)

https://www.cnblogs.com/dsj2016/p/5860171.html

快速排序什么时候时间复杂度最高O(n^2)?

答:每次你枢纽元选第一个元素,而这个数组又恰恰是非递减数组,那么算法复杂度就是O(n^2)。

当枢纽元选择左边第一个时为什么先要j--,而不是i++?

答:排序后有可能会造成,大于枢纽元的数据被排序到左边。比如{4,5,3} 枢纽元选4,i++ i指向5,j-- j指向3交换 后{4,3,5},i++ 和J相遇 交换枢纽元4和 i指的5后{5,3,4};5跑到4的前面,排序出了问题。

如果先从j开始减,不管是在中间相遇,还是一j下子直接减到了left,都是可以直接把枢纽元和i相交换。

如果是先j--,那么{4,5,3}  j会跑到i的领域,导致最后i和j相遇的i位置的数都会小于等于枢纽数。

#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
    int i,j,t,temp;
    if(left>right)
       return;
      
    temp=a[left]; //temp中存的就是基准数
    i=left;
    j=right;
    while(i!=j)
    {
                   //顺序很重要,要先从右边开始找
                   while(a[j]>=temp && i<j)
                            j--;
                   //再找右边的
                   while(a[i]<=temp && i<j)
                            i++;
                   //交换两个数在数组中的位置
                   if(i<j)
                   {
                            t=a[i];
                            a[i]=a[j];
                            a[j]=t;
                   }
    }
    //最终将基准数归位
    a[left]=a[i];
    a[i]=temp;
   
    quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
    quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
    int i,j,t;
    //读入数据
    scanf("%d",&n);
    for(i=1;i<=n;i++)
                   scanf("%d",&a[i]);
    quicksort(1,n); //快速排序调用
   
    //输出排序后的结果
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    getchar();getchar();
    return 0;
}

java版本

public static void quickSort(int[] array, int left, int right) {
        if (left<right){
            int i = left;
            int j = right;
            int temp = array[left];
            while (i < j) {
                while (i < j && array[j] >= temp) {//找到比基准数小的数
                    j--;
                }
                while (i < j && array[i] <= temp) {//找到比基准数大的数
                    i++;
                }
                int x = array[j];
                array[j] = array[i];
                array[i] = x;
            }
            array[left] = array[i];//让基准数归位
            array[i] = temp;
            quickSort(array, left, i - 1);
            quickSort(array, i + 1, right);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值