快速排序算法

问题:
   将给定数据元素按照从小到大排序
快速排序思路:
   通过一趟排序将数据分成两个独立的部分,再分别对两部分数据快速排序(运用递归的思想)

完整程序:


#include <stdio.h>
#include <windows.h>

void quick_sort(int *array,int start,int end);
void show(int *array,int length);
int partition(int *array,int start,int end);

void main()
{
    //给定数组元素
    int array[] = {9,7,18,4,10,18,5,3,80,25};     
    //计算数组长度   
    int length = sizeof(array) / sizeof(array[0]);
    //排序
    quick_sort(array,0,length - 1);
    //显示排序后数组内容
    show(array,length);

    system("pause");
    return ;
}
int partition(int *array,int start,int end)
{
    int key = array[start];//保存每次排序数组的第一个位置数据
    while( start < end)
    {
    	//从尾部数据开始和key比较,若key <= array[end]则不用交换数据,反之结束while循环
        while(start < end && key <= array[end])
        {
            end--;
        }
        if(start < end)
        {
        	//将判断array[end]放在array[start]处 end 处的位置现在没有存放数据,为空
            array[start] = array[end];
            start++;	//start后移一位
        }
		//当key > array[start]时start继续后移,不用交换数据,反之while循环结束
        while(start < end && key > array[start])
        {
            start++;
        }
        if(start < end)
        {	
        //将array[start]的数据放在上次end的空位处,此时start位置为空
            array[end] = array[start];
            end--;	//end前移一位
        }
    }
    array[start] = key;	//将第一个位置的值放在空位置上
    return start;	//将分割位置的下标返回
}
void quick_sort(int *array,int start,int end)
{  
    int flag ;	//用于保存分割左右两边的数组下标
    if(start < end)
    {
        flag = partition(array,start,end);
        quick_sort(array,start,flag - 1);	//左边排序
        quick_sort(array,flag + 1,end);		//右边排序
    }
}
//输出数组内容
void show(int *array,int length)
{   
    printf("排序后的数组为:\n");
    for(int i = 0;i < length;i++)
    {
        printf("%d\t",array[i]);
    }
    printf("\n");
}

测试结果:

在这里插入图片描述

结果分析:

按照程序执行步骤逐步解析
在这里插入图片描述
声明:此文章为学习笔记,如有侵权请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Byte_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值