快速排序思想:
在数据中找一个基准数据,将数据按照基准数据分成两部分,前一段比基准小后一段比基准大,按照同样的思路分别处理前一段和后一段数据直到数据有序。
递归实现:
时间复杂度 : O(nlog(n))
空间复杂度 : O(log(n))
稳定性 : 不稳定
int OneQuick(int* arr, int* start,int* end)
{
int tmp = *start;
while (start < end)
{
while (start < end && *end > tmp) end--;
*start = *end;
while (start < end && *start < tmp) start++;
*end = *start;
}
*start = tmp;
return start - arr;
}
void Quick(int* arr, int* start, int* end)
{
if (end <= start) return;
int mid = OneQuick(arr, start, end);
Quick(arr, start,arr + mid - 1);
Quick(arr, arr + mid + 1, end);
}
void QuickSort(int* arr, int len)
{
Quick(arr,arr,arr + len - 1);
}
排序结果:
非递归实现:
将排序元素起始和终止位置存入栈中,进行排序得到基准,先将基准右边起始和终止位置元素入栈,再将左边起始和终止位置入栈,重复至栈空。
时间复杂度 : O(nlog(n))
空间复杂度 : O(log(n)) (根据栈使用空间决定)
稳定性 : 不稳定
引用其他项目建立的栈,包含其路径并将其项目生成文件设为静态库
#include "../栈/stack.h"
#include "../栈/stack.cpp"
void Quick2(int* arr, int* start, int* end)
{
stack st;
Initstack(&st);
ElemType val = { start,end };
Pushstack(&st,val);
while (!Emptystack(&st))
{
ElemType date;
date = Topstack(&st);
Popstack(&st);
int mid = OneQuick(arr, date.start, date.end);
if (arr + mid - date.start > 1)
{
val.start = date.start;
val.end = arr + mid - 1;
Pushstack(&st,val);
}
if (date.end - (arr + mid) > 1)
{
val.start = arr + mid + 1;
val.end = date.end;
Pushstack(&st,val);
}
}
Destroystack(&st);
}
排序结果:
或者使用c++提供的栈
typedef struct
{
int* start;
int* end;
}ElemType;
void Quick3(int* arr, int* start, int* end)
{
stack<ElemType> st;
ElemType val = { start,end };
st.push(val);
while (!st.empty())
{
ElemType date;
date = st.top();
st.pop();
int mid = OneQuick(arr, date.start, date.end);
if (arr + mid - date.start > 1)
{
val.start = date.start;
val.end = arr + mid -1;
st.push(val);
}
if (date.end - (arr + mid) > 1)
{
val.start = arr + mid + 1;
val.end = date.end;
st.push(val);
}
}
}
排序结果: