执行结果截图1:
如果数组只有1个元素的情况,也想调用quick_sort()函数看看执行的过程,那么:
执行结果截图2:数组有2个元素需要排序
执行结果截图3:数组有3个元素需要排序
执行结果截图4:数组有14个元素需要排序
(过程打印得太多了,有兴趣自己运行代码,这里只截图最后结果):
代码:
/* 快速排序算法的基本思想是:
* 通过一趟排序将待排序数据分割成独立的两部分,
* 其中一部分的所有元素均比另一部分的元素小,
* 然后分别对这两部分继续进行排序,重复上述步骤直到排序完成。
*/
#include <stdio.h>
void quick_sort(int *, int, int, int);
/* debugTab的值代表不同标签:
* 0代表quick_sort(array, left, right, debugTab)被调用,
* 1代表quick_sort(array, left, j, debugTab)的递归调用,
* 2代表quick_sort(array, i, right, debugTab)的递归调用,
*/
int debugTab = 0;
//quick_sort(int array[], int left, int right, int debugTab)的调用次数统计
int debugFirstCount = 0;
// quick_sort(array, left, j, debugTab)的递归调用次数计数
int debugLeftCount = 0;
// quick_sort(array, i, right, debugTab)的递归调用次数计数
int debugRightCount = 0;
// quick_sort(int array[], int left, int right, int debugTab)的第几层调用结束
int debugFirstEndCount = 0;
// quick_sort(array, left, j, debugTab)的第几层递归结束
int debugLeftEndCount = 0;
// quick_sort(array, i, right, debugTab)的第几层递归结束
int debugRightEndCount = 0;
// 定义递归函数quick_sort,用于对整型数组所有元素进行左小右大的排序
void quick_sort(int array[], int left, int right, int debugTab)
{
// 注意:左下标left和右下标right和递归函数标记debugTab会随着再次递归调用的输入参数变化而变化
// 定义数组下标变量i和j并初始化为数组左下标和右下标
int i = left, j = right;
int temp;
int pivot;
if (1 == debugTab)
{
printf("The %d times loading quick_sort(array, last left=%d, last j=%d, debugTab=%d)...\n", ++debugLeftCount, left, right, debugTab);
}
else if (2 == debugTab)
{
printf("The %d times loading quick_sort(array, last i,=%d, last right=%d, debugTab=%d)...\n", ++debugRightCount, left, right, debugTab);
}
else if (0 == debugTab)
{
printf("The %d time loading quick_sort(int array, left=%d, right=%d, int debugTab=%d)....\n", ++debugFirstCount, left, right, debugTab);
}
printf("Assigned i = left = %d j = right = %d\n", left, right);
// 将排在数组中间位置的元素的值赋值给pivot,(left +right) / 2)会被array自动取整
pivot = array[(left + right) / 2];
// 监控(left + right) / 2 的值非整数的情况
printf("(left + right) / 2 is:%f\npivot -> array[%d]:%d\n", (float) (left + right) / 2, (int) (left + right) / 2, pivot);
// 只要数组第i个元素当前位置不是排在第j个元素的右边,就继续执行下去,否则排序结束
while ( i <= j)
{
// 从左到右找到第一个大于等于基准点的元素
while (array[i] < pivot)
{
// printf("checking if (array[%d] = %d) < (pivot = %d)...\n", i, array[i], pivot);
i++;
printf("Operated i++ for checking next array[%d], now i:%d\n", i, i);
}
printf("Founded array[%d] = %d >= (pivot = %d)\n", i, array[i], pivot);
// 从右到左找到第一个小于等于基准点的元素
while(array[j] > pivot)
{
// printf("checking if (array[%d] = %d) > (pivot = %d)...\n", j, array[j], pivot);
j--;
printf("Operated j-- for checking next array[%d], now j:%d\n", j, j);
}
printf("Founded array[%d] = %d <= (pivot = %d)\n", j, array[j], pivot);
// 只要数组的第i个元素不是排在第j个元素的右边,就将这两个数组元素互换一下位置, 如果第i个元素就是第j个元素,那也要迭代一次以满足结束迭代的条件
if (i <= j)
{
printf("Because (i=%d) <= (j=%d), so exchanging array[%d]and array[%d]...\n", i, j, i, j);
// printf("Before exchange, array[%d]:%d\n", i, array[i]);
// printf("Before exchange, array[%d]:%d\n", j, array[j]);
temp = array[i];
array[i] = array[j];
array[j] = temp;
printf("\nAfter exchange, array[%d]:%d array[%d]:%d\n\n", i, array[i], j, array[j]);
i++;
printf("Operated i++ for checking next array[%d], now i:%d\n", i, i);
j--;
printf("Operated j-- for checking next array[%d], now j:%d\n", j, j);
}
/* 设置左下标递归和结束条件:
* 只要数组左下标的位置排在数组元素j的左边,就执行左下标递归
* 否则结束左下标递归
*/
if(left < j)
{
//执行左下标递归
debugTab = 1;
printf("loading quick_sort(array, left, j, debugTab)...\n");
quick_sort(array, left, j, debugTab);
}
printf("Finished checking if(left=%d < j=%d) \n", left, j);
/* 设置右下标递归和结束条件:
* 只要数组元素i的位置排在数组右下标的左边,就执行右下标递归
* 否则结束右下标递归
*/
if(i < right)
{
//执行右下标递归
debugTab = 2;
printf("Loading quick_sort(array, i, right, debugTab)\n");
quick_sort(array, i, right, debugTab);
}
printf("Finished checking if(i=%d < right=%d)\n", i, right);
printf("Checking if i=%d <= j=%d...\n", i, j);
}
switch(debugTab)
{
default :
printf("Error!!!-> wrong debugTab value:%d", debugTab);
break;
case 2 :
printf("Because i=%d > j=%d, ended %d level recursion of quick_sort(array, i, right, debugTab=%d) \n", i, j, debugRightEndCount++, debugTab);
break;
case 1 :
printf("Because i=%d > j=%d, ended %d level recursion of quick_sort(array, left, j, debugTab=%d)\n", i, j, debugLeftEndCount++, debugTab);
break;
case 0 :
printf("Because i=%d > j=%d, ended %d level recursion of quick_sort(int array[], int left, int right, int debugTab=%d)\n", i, j, debugFirstEndCount++, debugTab);
break;
}
}
int main(void)
{
// int array[] = {73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109};
// int array[] = {100,55,33,11};
int array[] = {88,66,22};
// int array[] = {100,200};
// int array[] = {9};
int i, arrayLength;
arrayLength = sizeof(array) / sizeof(array[0]);
if (arrayLength > 1)
{
quick_sort(array, 0, arrayLength - 1, debugTab);
}
else
{
printf("这个数组只有1个元素,不需要用迭代来排序了。\n");
}
printf("排序后的结果是:\n");
for (i = 0; i < arrayLength; i++)
{
printf("%3d ", array[i]);
}
return 0;
}