第一步:定义一个right从数组最后一个元素开始即数组的右边开始向左边遍历,如果找到比key小的值就停下来。 第二步:定义一个left从数组第一个元素开始即数组的左边开始向右遍历,如果找到比key大的值就停下来。 第三步:left和right都停下来之后,交换left和right的值,这一步的目的就是将比key小的值往左放,将比ke...
2)霍尔法快排实现: 快排首先是被霍尔大佬提出来的,实现的方案有些复杂,首先需要两个指针(left, right)左指针指向数组首元素下标,右指针指向数组末元素下标,以数组首元素为基准值,以基准值(pivot)为界限,左右指针把小于pivot的数据甩到左边,大于pivot的数据甩到右边。 右指针先开始向左寻找比pivot小的,找到与左指...
(arr, l, i - 1); //对左半部分进行快排 quickSort(arr, j + 1, r); //对右半部分进行快排 } } void main() { int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 10 }; int len = sizeof(a) / sizeof(int); for (int i = 0; i < len; i++) { printf("排序之前:index...
选取主元后,将原数组划分为:值小于等于主元的左子数组,值大于等于主元的右子数组。然后递归地对左右子数组进行上述操作,知道递归的基础情况直接返回子数组(递归调用的过程类似二叉树的前序遍历)。 比较基础的情况: 输入数组大小为3, 选取主元并划分后,左子数组和右子数组包含1个数,递归调用快排直接返回,此时已经是...
▷ “数组”,“左指针位置”,“右指针位置”。 2、用变量tmp作为存放本轮循环的基准数。 3、用变量i作为左指针,获取传递过来的值(变量left的值) 4、用变量j作为右指针,获取传递过来的值(变量right的值) 5、第一层while外循环的内部结构是: ▷有一个一直从后向前寻找比基准数小的右指针 ...
快排的基本思路 1、先找整个数组的key 2、找【begin, key-1】和【key + 1, end 】区间的key 3、再去重复递归左右区间,当区间只剩一个值或者不存在时就是最小规模的子问题。 1、hoare版本 2、挖坑法 挖坑法思路简介 第二个版本:挖坑法(PartSort) ...
quickSort(arr, j + 1, r); //对右半部分进行快排 } } void main() { int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 10 }; int len = sizeof(a) / sizeof(int); for (int i = 0; i < len; i++) { printf("排序之前:index:%d value:%d\n", i, a[i]); } //快速...
(arr, l, i - 1); //对左半部分进行快排 quickSort(arr, j + 1, r); //对右半部分进行快排 } } void main() { int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 10 }; int len = sizeof(a) / sizeof(int); for (int i = 0; i < len; i++) { printf("排序之前:index...
首先将一组要排序的数以数组的形式输入进去,选取一个基准值(用于比较,一般选取数组的第一个数作为基准值),进行第一轮排序后,将小于基准值的数排在基准值前,大于基准值的数排在基准值后,这样就将数组分成了三组,然后运用递归,将第一组和第三组再进行排序、分组,直至每组只有一个数据,就完成了对这组数的排序...
快排C语言实现 快排的主要思想就是把一组数分成两组,左边那一组的最大数都比右边的最小数小,然后再对左边那一组数进行相同操作,再对右边的数进行相同操作。直到这一组数变成一个数单独成组,排序完成。 比如3 5 9 -8 5 4 在第一次分组时变成 第一组{-8} 标准值3 第二组{5 9 5 4} 这里标准值就...