(升序)快速排序的思想:

(升序)快速排序的思想:

描述:

​ 快速排序具体可以分为两块部分:踢与分。

  1. 踢:将线性队列中的某个元素a(一般是开头的元素),由两端往中间比较,为它选择合适的位置,达成队列中a元素的左侧的元素的值小于a元素值,右侧的元的素值大于a元素值。由此,确定了a元素在升序线性表中的位置就确定了下来。
  2. 分:线性表中a元素的位置确定,接下来对a元素左侧和右侧的子线性表进行排序,用上述的方法对子线性表排序。

时间复杂度:O(NLogN)

分析:以树的概念,树的深度为LogN,同深度的线性表处理时N,LogN*N=O(NLogN)

代码:

#ifndef QUICKSORT_H_INCLUDED
#define QUICKSORT_H_INCLUDED

/* 升序:为长度为n的数组s快排,0起始 */
void QuickSort(int s[], int n)
{
    
    
    if(n<=1)
        return ;
    int i=0, j=n-1;
    while(i<j){
    
    
        int key=s[i];
        while(i<j && key<=s[j]){
    
    
            j--;
        }
        s[i] = s[j];
        while(i<j && s[i]<=key){
    
    
            i++;
        }
        s[j] = s[i];
    }
    return ;
}


#endif // QUICKSORT_H_INCLUDED

代码测试

代码检测路径:

https://pintia.cn/problem-sets/15/problems/720

测试代码:

#include<stdio.h>

void QuickSort(int dt[], int s, int n)
{
    
    
    if(s+1>=n)
        return ;
    int i=s, j=n-1;
    int key=dt[i];
    while(i<j){
    
    
        while(i<j && key<=dt[j]){
    
    
            j--;
        }
        dt[i] = dt[j];
        while(i<j && dt[i]<=key){
    
    
            i++;
        }
        dt[j] = dt[i];
    }
    dt[i] = key;
    QuickSort(dt, s, i);
    QuickSort(dt, i+1, n);
    return ;
}


int main(void)
{
    
    
    int n;
    int num[100000];
    scanf("%d", &n);
    for(int i=0; i<n; i++){
    
    
        scanf("%d", &num[i]);
    }
    QuickSort(num, 0, n);
    for(int i=0; i<n; i++){
    
    
        printf("%d", num[i]);
        if(i+1<n){
    
    
            printf(" ");
        }
        else{
    
    
            printf("\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46198140/article/details/112856605