功能要求通过“递归”完成一组数组的排序。
数组如下:
首先呢常见的几种数组排序有:选择排序,冒号排序,插入排序,快速排序;
这里呢我们用到的是 快速排序
算法的基本思想是:通过一趟排序将待排序的数据分割成独立的两个部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,重复上述步骤直到排序完成
实现原理如下:
1.随便找一个元素作为基准点例如:
这里用到第五个元素“7”用来区分比“7”小的一部分和比“7”大的一部分数据
2.我们从左往右遍历找到大于等于“7”的元素然后停下来例如:
这里我们找到了“9”然后我们停下来,此时“i”是第三个元素
3.我们从右往左遍历找到小于等于“7”的元素也停下来例如:
这里我们找到了“1”停下来,此时“j”是倒数第一个元素
4.我们对“9”和“1”进行交换
5.重复2-4的步骤……
重复2的步骤:我们从左往右遍历找到大于等于“7”的元素然后停下来例如:
“7”本身也要进行交换哦因为他符合大于等于“7”我们停下来
重复3的步骤:我们从右往左遍历找到小于等于“7”的元素停下来
重复4的步骤:进行交换
重复2的步骤
重复3的步骤
重复4的步骤
此时呢右往左找到了6,左往右也找到6符合条件自身转换。
此时我们得到一开始说的思想“通过一趟排序将待排序的数据分割成独立的两个部分,其中一部分的所有元素均比另一部分的元素小”
然后呢我们要进行“分别对这两部分继续进行排序,重复上述步骤直到排序完成”
实现代码:
template <typename T>
void QuickSort(T& ary, int left, int right)
{
if (left >= right)
return;
int i, j, base, temp;
i = left, j = right;
base = ary[left]; //取最左边的数为基准数
while (i < j)
{
while (ary[j] >= base && i < j)
j--;
while (ary[i] <= base && i < j)
i++;
if (i < j)
{
temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
}
//基准数归位
ary[left] = ary[i];
ary[i] = base;
QuickSort(ary, left, i - 1);//递归左边
QuickSort(ary,i + 1, right);//递归右边
}
调用例子:
/*************************************************
Copyright:
Author:益脑三通
Date:2019-09-02
Description:武汉科锐软件安全教育机构学习记录
**************************************************/
#include <stdio.h>
#include <stdlib.h>
void quickSort(int *nAry, int nLeft, int nRight);
int main()
{
int nAry[] = { 5,2,9,4,7,8,6,3,0,1 };
int nLength = sizeof(nAry) / sizeof(nAry[0]);
QuickSort(nAry,0, nLength - 1);
printf("排序后数组:");
for (int i = 0; i < nLength; i++)
{
printf("%d ", nAry[i]);
}
system("pause");
return 0;
}