快排
核心是从左开始,每一个数都优先找到自己的位置;
难点在于排序的步骤要安排好,用二分思想理解是一条不错的方法。
理解整段代码是有两个部分的,第一是每一个元素找到自己的位置,第二是整体步骤的安排,也就是递归的用法(压栈)。
int a[101], n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left > right)
return; //递归的归,新手记住归只是返回一层递,然后能不能再次返回还是要判断的
temp = a[left]; //temp中存的就是基准数
i = left;
j = right;
while (i != j)
{
//顺序很重要,要先从右往左找
while (a[j] >= temp && i < j)
j--;
//再从左往右找
while (a[i] <= temp && i < j)
i++;
//交换两个数在数组中的位置
if (i < j)//当哨兵i和哨兵j没有相遇时
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//最终将基准数归位
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1);//继续处理左边的,这里是一个递归的过程,归的返回是一层一层返回的;
//重点:内层返回后要继续下一行代码的,即quicksort(i + 1, right);它也是个递归
quicksort(i + 1, right);//