一.
二.
时间复杂度O(nlogn)
空间复杂度(O(logn))
不稳定
三.
1.代码实现
#include<stdio.h>
int Partition(int* arr, int left, int right)
{
int tmp = arr[left];
while (left<right)
{
while (left<right&&tmp <=arr[right])
{
right--;
}
if (left == right)
{
break;
}
arr[left] = arr[right];
while (left<right&&tmp > arr[left])
{
left++;
}
if (left == right)
{
break;
}
arr[right] = arr[left];
}
arr[left] = tmp;
return left;
}
void Quick(int* arr, int left, int right)
{
int par = Partition(arr, left, right);
if (left < par - 1)
{
Quick(arr, left, par - 1);
}
if (par + 1 < right)
{
Quick(arr, par + 1, right);
}
}
void Quick_Sort(int* arr, int len)
{
Quick(arr, 0, len - 1);
}
int main()
{
int arr[] = { 2,5,3,1,3,4 };
int len = sizeof(arr) / sizeof(arr[0]);
Quick_Sort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
2.非递归代码实现:
#include<stdio.h>
int Partition(int* arr, int left, int right)
{
int tmp = arr[left];
while (left<right)
{
while (left<right&&tmp <=arr[right])
{
right--;
}
if (left == right)
{
break;
}
arr[left] = arr[right];
while (left<right&&tmp > arr[left])
{
left++;
}
if (left == right)
{
break;
}
arr[right] = arr[left];
}
arr[left] = tmp;
return left;
}
#include <stack>
void Quick_No_Recursion(int arr[], int left, int right)
{
std::stack<int> st;
st.push(left);
st.push(right);
while (!st.empty())
{
int tmp_rigiht = st.top();
st.pop();
int tmp_left = st.top();
st.pop();
int par = Partition(arr, tmp_left, tmp_rigiht);
if (left < par - 1)
{
st.push(left);
st.push(par - 1);
}
if (par + 1 < right)
{
st.push(par + 1);
st.push(right);
}
}
}
void Quick_Sort(int* arr, int len)
{
Quick_No_Recursion(arr, 0, len - 1);
}
int main()
{
int arr[] = { 2,5,3,1,3,4 };
int len = sizeof(arr) / sizeof(arr[0]);
Quick_Sort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
return 0;
}