算法思想是什么?
分治,利用指针开辟虚拟空间
算法步骤是什么?
1.选择数组中的第一个元素arr[startIndex]作为轴(pivot)
2.左指针为left,从最左边开始寻找第一个比pivot大的数
3.右指针为right,从最右面的一个元素开始向左寻找第一个小于等于pivot的数值
4.经过2,3两个步骤后,将会出现以下两种情况
(1):left和right没有相遇,此时进行交换,swap(arr,left,right);
(2):left和right相遇,做swap(arr,startIndex,left),然后返回left
5.partition中返回pivot用于分割数组,下一次用于排序的数组被分割为(startIndex,pivot-1),(pivot+1,endIndex)两段,进行递归操作
算法代码是什么?
#include <iostream>
using namespace std;
const int N = 100010;
int q[N];//开辟数列空间
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;//排除只有一个数或没有数的情况
int i = l - 1, j = r + 1;//因为后面是i++和j++,所以开头就要向外扩展一格
int x = q[l + r >> 1];//比特操作,取数列中间的数为pivot
while (i < j)
{
do i ++ ; while (q[i] < x);//直到i对应的数大于x才停止
do j -- ; while (q[j] > x);//直到j对应的数小于j才停止
if (i < j) swap(q[i], q[j]);//如果没有相遇就交换
}
quick_sort(q, l, j);//递归左右处理两端
quick_sort(q, j + 1, r);
}
int main()
{
int n;
scanf("%d", &n);//明确数列数的个数
for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);//输入待排列的数组
quick_sort(q, 0, n - 1);//带入快排函数
for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);//打印出排列好的数组
return 0;
}