史上最易懂的快速排序源代码及截图

#include <stdio.h>
#pragma warning(disable:4996)

void quicksort(int *arr, int left, int right)
{
    
    

   //要有递归的控制判断
	if (left>right) //只能是>, 不能==
	{
    
    
		return;
	}
	
	//否则的话,如递归所有控件路径,函数将导致运行时堆栈溢出
	
	int l = left;
	int r = right;
	int key = arr[left];//找第一个数为基准数
	//接下来将比基准数大的数字放在右边,比基准数小的数字放在左边
	
	while (l!=r)
	{
    
        //因为设置的基准数是最左边的数字
	     //所以注意要先从右边开始寻找,寻找比key小的数
		while (arr[r] >=key&&l<r) //注意为 >=,由于数列中可能有相同的数。
		{
    
    
		
			r--;
		}
      //之后在左边寻找比key大的数
		while (arr[l]<=key&&l<r)  //注意为 <=,同上。
		{
    
    
			l++;
			
		}
     //当l<r时,进行数字交换
		if (l < r)
		{
    
    
			int tmp = arr[l];
			arr[l] = arr[r];
			arr[r] = tmp;

		}
	}
   //当l==r时,基准数与arr[l]进行交换
	arr[left] = arr[l];
	arr[l] = key;
	//进行函数递归
	quicksort(arr, left, l - 1);
	quicksort(arr, l + 1, right);

}

int main()
{
    
    
	int arr[] = {
    
     6, 1, 2,7,9,3,4,5,10,8 };
	int n = sizeof(arr) / sizeof(int);
	int left = 0;
	int right = n - 1;
	quicksort(arr, left, right);

	for (int i = 0; i < n; i++)
	{
    
    
		printf("%d ", arr[i]);
	}

	return 0;

}

在这里插入图片描述

第一次循环结束之后,left和right指向同一位置,此时数列的顺序:

在这里插入图片描述

之后进行函数的递归调用!
最终快速排序实现!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cfk17829572643/article/details/114497636