快速排序
这里提供了三种快排不同的排列数据思想
1.左右指针法
int PartSort(int* arr, int start, int end)
{
int key = start;
while (start < end)
{
while (start < end && arr[end] >= arr[key])//第一个限定条件防止所有的值都比我们选的key小直接发生越界
{
end--;
}
while (start < end && arr[start] <= arr[key])
{
start++;
}
Swap(&arr[start], &arr[end]);
}
Swap(&arr[key], &arr[end]);
return end;
}
2.挖坑法
int PartSort2(int* arr, int start, int end)
{
int key = arr[start];
while (start < end)
{
while (start < end && arr[end] >= key)
{
--end;
}
arr[start] = arr[end];
while (start < end && arr[start] <= key)
{
++start;
}
arr[end] = arr[start];
}
arr[start] = key;
return start;
}
3.前后指针法
int PartSort3(int* arr, int start, int end)
{
int key = start;
int cur = start + 1;
int pre = start;
while (cur <= end)
{
if (arr[cur] <= arr[key] && ++pre != cur)
{
Swap(&arr[cur], &arr[pre]);
}
++cur;
}
Swap(&arr[key], &arr[pre]);
return pre;
}
快排的分治
void QuickSort(int* arr, int start, int end)
{
if (end <= start) return;
int index = PartSort3(arr, start, end);
QuickSort(arr, start, index - 1);
QuickSort(arr, index+1, end);
}