//主要思路:先选第一个数组的值记为基准数
//从最后一个素组j的值开始与基准数比较,倒推(j--)
//当找到比基准数小的数值时,停止比较,
//从第一个数组i的值开始与基准数比较,正推(i++)
//当找到比基准数大的数值时,停止比较,
//将2个比较停止时数组的值交换
//交换结束后比较i与j的值,若不相等,重新进入第一个大while循环,
//继续将j和i分别先倒退和后正推(记住先后顺序,很重要)
//重复上述步骤,等i和j的位置数推到中间相等时,跳出大while循环
废话少说直接上代码
建议读者直接复制在编译器上认真看谢谢
#include<stdio.h>//快速排序法(哨兵版)Quick_Sort是快速排序法的名字,
//格式是 Quick_Sort(a,b,c),a指数组名字,b和c指需要排序的数的位置
//一般b和c都是0和n-1,指数组中的第一位和最后一位;
void Quick_Sort(int arr[], int begin, int end){
if(begin > end) //要求条件是开始数的位置一定要小于结尾的数的位置,不然直接报错
return;
int temp = arr[begin]; //首先将第一位数组的值赋给temp
//主要思路:先选第一个数组的值记为基准数
//从最后一个数组j的值开始与基准数比较,倒推(j--)
//当找到比基准数小的数值时,停止比较,
//从第一个数组i的值开始与基准数比较,正推(i++)
//当找到比基准数大的数值时,停止比较,
//将2个比较停止时数组的值交换
//交换结束后比较i与j的值,若不相等,重新进入第一个大while循环,
//继续将j和i分别先倒推和后正推(记住先后顺序,很重要)
//重复上述步骤,等i和j的位置数推到中间相等时,跳出大while循环
//
int i = begin;//将第一位和最后一位的位置数分别赋给i和j
int j = end;
while(i != j){//,重点背诵记忆只要两位置数不相等,执行循环,记住格式3个大while+1个替换步骤
while(arr[j] >= temp && j > i)//
j--;//将最后的数的值倒数往前比较 ,倒推
while(arr[i] <= temp && j > i)
i++;//将前面的数的值倒数往后比较,正推
if(j > i)//这个条件我感觉去不去掉都可以
//为确保逻辑严谨性,还是保留吧
{
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}//跳出大while循环 ,此时已经确认第一个基准数的位置,重新循环上述大步骤
arr[begin] = arr[i];arr[i] = temp;//交换上一个基准数(第一次第一位)与停止时位置数的值
Quick_Sort(arr, begin, i-1);//此处为递归,重述上述步骤
Quick_Sort(arr, i+1, end);}//运用到2分法的思想
//具体就是把确定第一个基准数的位置作为分界点,左侧右侧一分为二
//左侧和右侧的数组重复上述操作
int main() //主函数开始
{ int arr[]={2,3,5,0,-5,-9,7,9,3,8};int i;//随便模拟了一些无规律10个的大小不同数
Quick_Sort(arr,0,9); //格式arr为 数组名字,0和9分别表示第一位和最后一位数组的位置数,
for(i=0;i<10;i++)//这期间的值依次按低到高排序
printf("%d ",arr[i]);//依次输出
}
//总结:快速排序法相比与插入排序法,冒泡排序法
//它能够减少计算机的计算次数,提高效率,节省内存占用和减少计算时间
//是一个非常值得学习的算法,建议读者跟着上述代码认真敲一遍
//认真理解算法内容,本文主要借鉴参考了CSDN上其他文章的思路,链接如下,可以打开详细学习
参考其他CSDN链接
建议读者打开认真看看快速排序法(详解)_小白的博客-CSDN博客_快速排序
已经停更一段时间了,很抱歉,我会继续努力的,加油,感谢每一位读者。