快排:
首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
时间复杂度:O(n^2)
空间复杂度:O(log n)
是否稳定:不稳定
适用场合:数据较多且杂乱
前后指针法:
#include <stdio.h>
#include <windows.h>
#pragma warning (disable:4996)
void Swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int Find_mid(int* arr, int left, int right)//三数取中法
{
int mid = left + ((right - left) >> 1);
if (arr[left] < arr[right])
{
if (arr[mid] < arr[left])
return left;
else if (arr[mid] > arr[right])
return right;
else
return mid;
}
else
{
if (arr[mid] > arr[left])
return left;
else if (arr[mid] < arr[right])
return right;
else
return mid;
}
}
int Sort(int* arr, int left, int right)
{
int key;
int begin = left;
int end = right - 1;
int keyIdx = Find_mid(arr, left, right-1);
if (keyIdx != right - 1)
{
Swap(&arr[keyIdx], &arr[right - 1]);
}
key = arr[right - 1];
while (begin < end)
{
while (begin < end && arr[begin] <= key)
begin++;
while (begin < end && arr[end] >= key)
end--;
if (begin < end)//
{
Swap(&arr[begin], &arr[end]);
}
else//只需将一个指针与参考值交换
{
Swap(&arr[begin], &arr[right-1]);
}
}
return begin;
}
void QuickSort(int* arr, int left, int right)//递归
{
if (left < right)//出口条件
{
int mid = Sort(arr, left, right);
QuickSort(arr, left, mid);
QuickSort(arr, mid + 1, right);
}
}
void printf_arr(int *arr,int size) //打印数组
{
int i = 0;
for (; i < size; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[10] = {2,7,1,4,3,9,6,0,5,8};
//int arr[10] = { 4,4,6,7,3,0,9,3,5,2 };
int size = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,0,size);
printf_arr(arr, size);
system("pause");
return 0;
}
挖坑法,hoare法后续更新……