5.快速排序,选择排序,冒泡排序

一.快速排序

转载请附上:https://blog.csdn.net/qq_37978862/article/details/104651495
步骤:
1.定第一个元素为中指
2.从右到左,右赋值给左
3.从左到右,左赋值给右

#include <stdio.h>
//1.随机定中值
//2.从右到左,右赋值给左
//3.从左到右,左赋值给右
int search_mid(int *p, int left, int right)
{
    //将第一个元素设为中值
    int mid = p[left];
    while (right > left)  //下标一定要右边大于左边
    {
        //右边的进行比较
        while (p[right] > mid && right > left)
            right--;
        p[left] = p[right];

        //左边的进行比较
        while (p[left] < mid && right > left)
            left++;
        p[right] = p[left];
    }
    //mid保存了 第一个元素,
    p[left] = mid;
    return left;
}
//*一定要记得递归必须有结束条件*
//1.找中点
//2.左排
//3.右排
void quick_sort(int *q, int left, int right)
{
    if (right > left)
    {
        int mid = search_mid(q, left, right);
        quick_sort(q, left, mid - 1);
        quick_sort(q, mid + 1, right);
    }
}
int main()
{
    int a[9] = {10, 20, 50, 98, 23, 1, 5, 88, 77};
    int i = 0;
    quick_sort(a, 0, 8);
    for (i = 0; i < 9; i++)
    {
        printf("%d\n", a[i]);
    }
}

二.选择排序

步骤:

首先找到数据中最小的数字,
与第一个位置互换,
然后次小的与第二个数据交换,重复,
实现由小到大排序
#include<stdio.h>
void choose_sort(int *p,int n)
{
    int i,j,index,t;
    for( i = 0;i<n-1;i++ )
    {
        index = i;
        for( j = i+1;j<n;j++  )
        {
            if(p[j]<p[index])
            {
                index = j;
            } 
        }
        //index的值发生变化,证明该位置的数,不是第该位置小
        if( index != i)
        {
            t = p[i];
            p[i] = p[index];
            p[index] = t;
        }
    }

}
int main()
{
    int i;
    int a[8] = {1,2,3,6,344,55,99};
    choose_sort(a,7);
    for(i = 0;i<7;i++)
    {
        printf("%d\n",a[i]);
    }
}

三.冒泡排序

#include<stdio.h>
void mao_pao(int *p,int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(p[j]>p[j+1])
            {
                t = p[j];
                p[j] = p[j+1];
                p[j+1] = t;
            }
        }
    }
}
int main()
{
    int i;
    int a[8] = {1,2,3,6,344,55,99};
    mao_pao(a,7);
    for(i = 0;i<7;i++)
    {
        printf("%d\n",a[i]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值