快速排序的排列方式
– 实现方法
有大概两种方法:
1.左右指针法
2.挖坑法
首先对于左右指针法,想了解的朋友,可以去看我的另一篇链接: 左右指针法。
接下来的就是挖坑法:
挖坑法的基本思路
- 其挖坑法思路和左右指针法的思路相似:
1.选出一个数据(一般是最左边或是最右边的)存放在key变量中,在该数据位置形成一个坑。
2、还是定义一个left和一个right,L从左向右走,R从右向左走。(若在最左边挖坑,则需要R先走;若在最右边挖坑,则需要L先走)
后面的思路与(左右指针法)思路类似在此处就不说了:
看图解:
假如要排序一串数组:
——
假如找出的是左边第一位放入key变量中,留下一个坑位:
然后有right,和left所指的位置:
开始移动,right先向左边进行一步一步寻找,直到找到比key小的数;
然后让right找到的数值填入这个坑中:
- 然后是left开始向右一步一步寻找到比key大的数停止,然后在让其填入right所指的坑中:
然后就是重复以上的操作,直到right和left相遇,让key的值填入这个坑中。
在这个时候 3 则是已经填入正确是位置,然后一部将3左边和右边分看成两个数组;
先看3左边的数组:
接下来也是和刚才一样的顺序:
找到左边第一位,放入key变量中,这时right向左移动一步,然后让left和right相遇,key再次填入这个坑中:
然而将1放入正确的位置后还剩一个数值,则这个数值就是在正确是位置;
注意:直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,代表此时此部分已有序。
再次看向3右边的数值:
与之一样的操纵:
进行第一次填坑:
- left找到大于key的数值,填入坑内:
然后right向左移动,会再次与left相遇,将key填入坑内:
这时是将6放入了正确的位置:
再次将6的左边和右边看成两个数组,进行排序:
与上述一样的步骤:
在最后将数组排序好;
代码的实现:
void QuickSort(int *arr,int begin,int end)
{
if (begin >= end)
return;
int left = begin;
int right = end;
int key = arr[begin];
while (begin < end)
{
//找小
while (arr[end] >= key && begin < end)
{
--end;
}
//小的放到左边的坑里
arr[begin] = arr[end];
//找大
while (arr[begin]<=key && begin<end)
{
++begin;
}
//大的放到右边的坑里
arr[end] = arr[begin];
}
//将key填入坑中
arr[begin] = key;
int keyi = begin;
QuickSort(arr, left, keyi - 1);
QuickSort(arr, keyi + 1, right);
}
int main()
{
int arr[8] = { 3,2,4,6,5,7,9,1 };
int left = 0;
int right = 7;
QuickSort(arr, left,right);
for (int i = 0; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
——
最后感谢所有观看的朋友们:^ _ ^