快速排序算法的思想就是:
分治的思想,先找一个基准数然后把大的放在一面小的放在另一面,然后递归继续找,当初大一研究了1个多月没弄懂现在大二学了搜索之后,感觉真的简单,发现有时候有的算法真的需要你的积累再去学,盲目学费时费力,最好是可以先放放等你水平上来在看。
快速排序法 = 分治法 + 挖坑填数
分治法:
大问题分解成各个小问题,对小问题求解,使得问题解决
1.从右向左开始找第一个小于基准数元素
2.从左向右开始找第一个大于基准数的元素
3.继续执行上面俩步
例如:arr[] = { 4, 8 ,9 ,5 ,6 ,3 ,1 ,2 ,0 ,7};
把第一个数当成基准数:arr[0] = 4;
设start = 0, end = 9
然后把arr[0]提取出来,执行第一步从右往左比找到第一个比arr[0]小的元素然后在把这个数放在arr[0]一开始的位置是0,
找的过程中end--,因为最后要把左面放的都是比基准数小的,右面都是大的,所以在遍历判断的时候要strat < end,
然后执行第二步从左往右找第一个比arr[0]大的元素,找到后放到刚刚比arr[0]小的位置,在遍历过程中start++最后重复执行
一直到左面都是比基准数小的右面都是比基准数大的,然后在分别递归左右,把左右的位置传进去,一直到最后排好序为止。
//核心代码
int ll = 0;
void Quick_Sort(int arr[], int start, int end)
{
if(start >= end)
{
return ;
}
int i = start;
int j = end;
//找一个基准数
int temp = arr[start];
if(i < j)
{
while(i < j)
{
//执行第一步,从右往左找比基准数小的
while(i < j && arr[j] >= temp)
{
j--;
}
//如果找完之后不是它本身,那么把这个数放在基准数的左面
if(i < j)
{
arr[i] = arr[j];
//第一个数放完了然后更新下位置
i++;
}
//执行第二步,从左往右找比基准数大的
while(i < j && arr[i] < temp)
{
i++;
}
if(i < j)
{
arr[j] = arr[i];
j--;
}
}
}
cout << " i = " << i << " j = " << j << endl;
for(int k = 0; k < ll; k++)
{
cout << arr[k] << " ";
}
cout << endl;
//排完之后放基准数
arr[i] = temp;
//然后左右分别递归
//左半部分
Quick_Sort(arr, start, i - 1);
//右半部分
Quick_Sort(arr, i + 1, end);
}
//示例代码:
/*
快速排序法 = 分治法 + 挖坑填数
分治法:
大问题分解成各个小问题,对小问题求解,使得问题解决
1.从右向左开始找第一个小于基准数元素
2.从左向右开始找第一个大于基准数的元素
3.继续执行上面俩步
基准数:arr[0] = 4;
*/
# include <iostream>
using namespace std;
void PrintArray(int arr[], int len)
{
for(int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
//快速排序从小到大
void Quicksort(int arr[], int start, int end)
{
int i = start;
int j = end;
//基准数
int temp = arr[start];
/*
第一次从右向左比基准数小的
大的在基准数右面,小的在基准数左面
int temp = 4;
*/
if(i < j)
{
//继续挖坑填数
while(i < j)
{
//从右向左去找比基准数小的
while(i < j && arr[j] >= temp)
{
j--;
}
//填坑
if(i < j)
{
arr[i] = arr[j];
i++;
}
//从左向右 找比基准数大的数
while(i < j && arr[i] < temp)
{
i++;
}
//填坑
if(i < j)
{
arr[j] = arr[i];
j--;
}
}
//把基准数放到 i 位置
arr[i] = temp;
//对左半部分进行快速排序
Quicksort(arr, start, i - 1);
//对右半部分进行快速排序
Quicksort(arr, i + 1, end);
}
}
int main(int argc, char *argv[])
{
int myArr[] = {4, 2, 8, 0, 5, 7, 1, 3, 9};
int len = sizeof(myArr) / sizeof(int);
PrintArray(myArr, len);
Quicksort(myArr, 0, len - 1);
PrintArray(myArr, len);
}