【基础知识】之 快排(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

输出:

原文地址:https://www.cnblogs.com/elaron/p/3084360.html