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