快速排序算法思想:(举例说明)
(1)简单总结三步:
第一步,从后往前找比基准小的数据,往前挪
第二步,从前往后找比基准大的数据,往后挪
第三步,重复第一步和第二步
(2)eg: 34, 5, 6,22,56,88,11,2,4,0(一段非有序整数数据)
定义一个下标low指向这一段数据的第一个,即34;定义一个下标high指向这段数据的最后一个,即0;
找一个基准,一般找这一段数据的第一个就行,也就是low下标所指的值34;
(3)依次进行(1)中所说步骤,
第一步,
因为0<34,将0往前挪,挪在基准空余的位置,因为有临时变量保存34,所以不怕数据丢失
第二步,
因为56>34,将56往后挪,挪在空位上,以此类推,当high=low时,快排中的一次完成,也就找到了基准34的位置,(如下图)那最终排好序要进行多少次呢,可以看到一次排序后34前后分为了两块,将这两块在进行如上操作,这就是第三步,当每部分只剩一个数时,快排结束。
后面的步骤可以自己再画一画,话不多说上代码:
#include <stdio.h>
int Partition(int* arr, int low, int high)
{
//一次划分
int tmp = arr[low];//基准
while (low < high)
{
//(1)从后往前找比基准小的数字
while (low<high && arr[high]>tmp)
{
high--;
}
if (low < high)
{
arr[low] = arr[high];
}
//(2)从前往后找比基准大的数字
while (low < high && arr[low] <= tmp)
{
low++;
}
if (low < high)
{
arr[high] = arr[low];
}
}
arr[low] = tmp;
return low;
}
void Quick(int* arr, int low, int high)
{
int par = Partition(arr,low, high);
if (low < par - 1)//左边数据超过一个
{
Quick(arr, low, par - 1);
}
if (par + 1 < high)//右边数据超过一个
{
Quick(arr, par + 1, high);
}
}
void QuickSort(int* arr, int len)
{
Quick(arr, 0, len - 1);//参数一致
}
void Show(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 34, 5, 6,22,56,88,11,2,4,0 };
QuickSort(arr, sizeof(arr) / sizeof(arr[0]));
Show(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
大家一定要按照代码一步一步再走一遍,更能理解哦。。。