疾速排序
思维:任取待排序元素序列中的某个元素作为基准,依照该元素的排序码大小,把整个元素序列分为左右两个子序列:左侧子序列中的所有元素都比基准元素小,右侧所有元素都比基准元素大,而后别离对这两个子序列反复之前的操作,直到整个序列排好序。
例子:
初始序列: 基准(pivot)
21 25 49 25* 16 8 21
1 8 16 21 25 25 49 8(left) 25(right)
2 8 16 21 25* 25 49 25(right)
3 8 16 21 25* 25 49
稳定性:不稳固
工夫复杂度:O(nlogn)
代码:c++
//疾速排序
void Quick_sort(int arr[],int left,int right) {
if (left >= right) return; else { int pivot = arr[left];//基准 int i = left;//左指针 int j = right;//右指针 while (i < j) {//当左<右时,扫描序列 while (i < j && arr[j] >= pivot)//从右往左扫描遇到比基准小的值则停下来 j--; while (i < j && arr[i] <= pivot)//从左往右扫描遇到比基准大的值则停下来 i++; if (i<j) {//而后替换这两个值 swap(arr[i], arr[j]); } } if (i = j) {//当扫描到左右指针相遇时,示意扫描完结,将基准值和以后地位的值进行替换
//咱们始终是以最右边的元素为基准元素的
arr[left] = arr[i]; arr[i] = pivot; } Quick_sort(arr, left,i-1); Quick_sort(arr, i+1,right); }
}