冒泡排序,选择排序,插入排序(用数组实现)

#include <stdio.h>

/*
 * 实参传指针型形参时, 传入实参的地址,
 * 对指针形参所指的实参地址中的内容进行修改,
 * 指针形参虽释放,但实参地址中的值改变。
 */
 /*
 **temp指针变量是未知存储单元不可赋值
 *C语言中实参变量单向传递给形参变量
 *形参值的改变不能使实参的值随之改变。
 */
void swap(int *a, int *b)
{
    int tmp;

    tmp = *a;
    *a  = *b;
    *b  = tmp;
}

void print_array(int *v, int len)//打印一维数组
{
    int i;

    for (i  = 0; i < len;  i++)
    {
        printf("%d ", v[i]);
    }
    printf("\n");
}

void bubble_sort(int *v, int len)//冒泡排序(确定顺序后可提前跳出循环进行优化)
{
    int i;
    int j;
    int times = 0;//记录循环次数

    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)//(len - 1)注意越界
        {
            if (v[j] > v[j + 1])
            {
                //swap(&v[j], &v[j + 1]);
                swap(v + j, v + j + 1);//指针P+1 = 指针P + sizeof(指针的类型)* 1

            }
            times++;
        }
        print_array(v, len);
    }
    printf("%d\n", times);
}

void select_sort(int *v, int len)//选择排序
{
    int max_value;
    int max_pos;
    int i;
    int j;

    for (i = 0; i < len - 1; i++)//控制循环次数,9个数循环8次
    {
        max_value  = v[0];//先将第一个数默认为最大的数与后面进行比较
        max_pos = 0;//标记最大值位置与最后一个元素进行交换

        for (j = 1; j < len - i; j++)//第一个值被使用,i的作用是不让最后一个数参与比较
        {
            if (v[j] > max_value)
            {
                max_value = v[j];
                max_pos = j;
            }
        }
        swap(v + max_pos, v + len - i - 1);//将最大值放最后,(len - i - 1)是最大值的下标
        print_array(v, len);
    }
}

void insert_sort1(int *v,  int len)//插入排序考试版
{
    int i;
    int j;
    int value;//取插入的值

    for (i = 1; i < len; i++)//从a[1]开始,末尾结束
    {
        value = v[i];
        for(j  = i; j > 0 && value < v[j-1]; j--)//&&左右顺序搞反会导致j=0时越界
        {
            v[j] = v[j-1];
        }
        v[j] = value;
        print_array(v, len);
    }
}

void insert_sort2(int *v,  int len)//插入排序正常逻辑版
{
    int i;
    int j;
    int value;

    for (i = 1; i < len; i++)
    {
        value = v[i];
        for(j  = i; j > 0; j--)
        {
            if (value > v[j - 1])
            {
                break;
            }
            v[j] = v[j-1];
        }
        v[j] = value;
        print_array(v, len);
    }
}


int main()
{
    int a[] = {1,21,15,42,27,83,19,110,-111};
    int len = sizeof(a) / sizeof(a[0]);//36Byte/4Byte求出数组成员个数

    print_array(a, len);
    bubble_sort(a, len);
    print_array(a, len);

    return  0;
}

1、 bubble_sort运行结果

2、select_sort运行结果  

3、insert_sort运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值