今天,大白带大家探讨一下快速排序。
排序过程:一趟快速排序采用从两头向中间扫描的办法,同时交换与基准(temp:取无序区的首位)记录逆序的记录。
(1)设两个指示器 i 和 j ,它们的初值分别为无序区中的首和末。
(2)令 j 自 t 起从右向左依次和基准比较,直至 arr[ j ] < temp,将arr[ j ] 移至 i 所指的位置上,然后令 i 自 i + 1 起从左向右依次和基准比较,直至 arr[ i ] > temp,将arr[ i ] 移至 j 所指的位置上。
(3)依次重复步骤(2),直至 temp 的右边都小于 temp, 左边都大于 temp。
然后利用递归对 temp 左右分别排序。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <functional>
#include <algorithm>
#include <numeric>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>
using namespace std;
void quickSort (int *arr, int s, int t) //将arr[s] 至 arr[t]中的元素进行快速排序
{
int i = s, j = t;
if(s < t)
{
int temp = arr[s]; //以temp为基准, 将arr分为两部分
while(i < j)
{
while(i < j && arr[j] >= temp) //从右向左找小于基准的记录
{
j--;
}
if(i < j)
{
arr[i] = arr[j];
i++;
}
while(i < j && arr[i] <= temp) //从左向右找大于基准的记录
{
i++;
}
if(i < j)
{
arr[j] = arr[i];
j--;
}
}
arr[i] = temp;
quickSort (arr, s, j - 1); //递归调用
quickSort (arr, j + 1, t);
}
}
int arr2[] = { 23, 13, 3, 6, 19, 28 };
int main()
{
quickSort (arr2, 0, 5);
for(size_t i = 0; i < 6; i++)
{
cout << " " << arr2[i];
}
cout << endl;
return 0;
}