zoukankan      html  css  js  c++  java
  • 【基础知识】之 快排(quick sorting)

    算法复习。

    时间复杂度:

    平均情况 O(n*log2n)

    最坏情况 O(n2)

    最好情况 O(n*log2n)

    思路:

    设待排序的数组为a,长度为n,起始i=0,j=n-1。对于每一轮快排:

    1、从右往左(j--的方向)查找到比key(一般设定为a[0])小的值,然后将a[i]与a[j]交换。

    2、从左往右(i++的方向)查找比key大的值,将a[i]与a[j]交换。

    3、一直执行1、2步骤,直到i>j。此时,key的左边为比key小的值,key的右边为比key大的值。然后再分别递归左半边array和右半边array。直到递归的终止条件(i>=j)满足,则停止递归。

    代码:

    #include <iostream>
    using namespace std;
    
    /*输出指定范围内的数组元素*/
    void showArray(int arr[], int start, int end){
        for(int i = start; i <= end; i++){
            cout << arr[i] << " ";
        }
        cout << endl;
    }
    
    /*交换指定位置的数组中的元素的值*/
    void swap(int arr[],int a, int b){
        int temp = 0;
        temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
    
    /*快排函数*/
    void sortUnit(int arr[],int i, int j){
        if(i >= j){
        return;
        }
        int key = arr[i];
        int start = i;
        int end = j;
    
        int temp = 0;
    
        while(i < j){
        
            while(arr[j] >= key && j > i){
                j--;
            }
            if(arr[j] < key){
                swap(arr,i,j);
            }
            while(arr[i] <= key && i < j){
                i++;
            }
            if(arr[i] > key){
                swap(arr,i,j);
            }
        }
        int center = (i + j)/2;
    
        /* 辅助功能,输出数据查看是否正确 */
        showArray(arr, start, end);
        cout << "center index = " << center  << " ,center value = " << arr[center] << endl << endl;
    
        /*递归快排左半边*/
        sortUnit(arr, start, center - 1);
        /*递归快排右半边*/
        sortUnit(arr, center + 1, end);
    
    }
    
    
    void main(){
        int n = 20;//设定测试数组长度为20
        int arr[20] = {0};//初始化数组
        for(int i = 0; i < n; i++){
            cin >> arr[i];
        }
        sortUnit(arr,0,n-1);
    
        //查看最终结果
        showArray(arr, 0, n-1);
    }

    代码测试:

    测试数据:

    用matlab随机产生一个1*20的向量,范围为(1,100)。

    >> a=randi([1,100],1,20)

    向量为:

    66     4    85    94    68    76    75    40    66    18    71     4    28     5    10    83    70    32    96     4

    输出:

  • 相关阅读:
    团队作业2-《需求规格说明书》
    团队作业 —— 团队选题
    自我介绍+软工五问
    团队作业5——测试与发布(Alpha版本)
    结对项目(与陈超国)
    个人项目wordcount
    自我介绍+软工5问
    个人项目(C语言)
    自我介绍+软工五问
    第三篇 Scrum冲刺博客
  • 原文地址:https://www.cnblogs.com/elaron/p/3084360.html
Copyright © 2011-2022 走看看