题目
取pivot为a[left]
思路
正常快排,记得判断相等情况
代码
#include<bits/stdc++.h>
using namespace std;
void quickSort(int* a, int left, int right, int n)
{
//if (left >= right) return;
if (left < right)
{
int pivot = a[left];
int i = left, j = right;
while (i != j)
{
while (i<j && a[j]>=pivot)
j--;
if (i < j) a[i] = a[j];
while (i < j && a[i] <= pivot)
i++;
if (i < j) a[j] = a[i];
}
a[i] = pivot;
for (int i = 0; i < n - 1; i++)
{
cout << a[i] << ' ';
}
cout << a[n - 1] << endl;
quickSort(a, left, i - 1, n);
quickSort(a, i + 1, right, n);
}
}
int main()
{
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
quickSort(a, 0, n-1, n);
return 0;
}
事实上这样也可以实现快排,也许是稳定性的问题(待解决)
#include<bits/stdc++.h>
using namespace std;
void Swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void quickSort(int* a, int left, int right, int n)
{
//if (left >= right) return;
if (left < right)
{
int pivot = a[left];
int i = left, j = right;
while (i != j)
{
while (i<j && a[j]>pivot)
j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] < pivot)
i++;
if (i < j) a[j--] = a[i];
}
a[i] = pivot;
for (int i = 0; i < n - 1; i++)
{
cout << a[i] << ' ';
}
cout << a[n - 1] << endl;
quickSort(a, left, i - 1, n);
quickSort(a, i + 1, right, n);
}
}
int main()
{
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
quickSort(a, 0, n-1, n);
return 0;
}