学习日记:排序

目录

1.选择排序

2.冒泡排序

3.插入排序

4.查找

4.1 二分查找


1.选择排序

思想:给合适的位置选择合适的数(用后面的数依次跟指定位置上的数比较,如果后面的书比指定位置的数小,就交换两个数,依次重复,一直到下标的倒数第二个)

图解:

step1:在初始的元素中找到最小值放到第一个位置

step2:在剩余数中找出最小值放到第二个位置

如此依次找出最小值。直到剩最后两个数,再比较其大小。

代码实现思路:

(1)有len个数,len个数需要交换len-1轮,且数组下标从0开始,那么最外层循环是 i 的

取值是 [0,len-1),

(2)定义 j 变量,表示当前最小数的下标,每轮循环时,默认假设初始值是最小值,即初始赋值 j = i+1

(3)遍历除当前最小数以外剩余的数,如果发现有比当前最小数更小的数,则记录更小的数的下标,然后两数交换

#include<stdio.h>

int main(void)
{
    int a[] = {4,1,3,5,7,0,9,2,6,8};
    int len = sizeof(a)/sizeof(a[0]);
    int i = 0;
    int j = 0;

    for(i = 0;i < len-1;++i)        // 控制位置,i表示下标,给i号位置找数,当找到了前面len-1                            
                                       个数,最后一个数就确定了
    {
        for(j = i+1;j<len;++j)      // 表示给i号位置找合适的数,要和后面所有的数都比较
        {
            if(a[j]<a[i])           // a[i]表示要找合适数的那个位置的原先的值, 依次用j号位置 
                                        的值去和i号位置的值进行比较

            {
                int temp = a[i];    // 引入一个中间值
                a[i] = a[j];        // 交换a[i]和a[j]
                a[j] = temp;
            }
        }
    }

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

    return 0;
}

2.冒泡排序

思想:一次冒一个数,相邻两个元素两两比较,小的放前,大的放后。(0和1上的位置的值比较,1和2位置上的值比较,依次比较,每次找出来的是最大数--- 升序) 

如果要将已知8个无序数列按从小到大排列,首先用第一个数和第二个数比较,如果后一个数比前一个数小,则交换位置,依次下去,进行7次比较,第一趟得出这组数的最大值,放在了数组最后一个位置,在我们后面的比较的时候,就不用再与其比较了,所以第二趟我们就进行6次比较,得出这组数的次大值,放在了下标为6的位置,如此循环进行循环7趟,就得到了我们由小到大的排序了。

#include<stdio.h>

int main(void)
{
    int a[] = {4,1,7,0,3,2,5,8,6,9};
    int len = sizeof(a)/sizeof(a[0]);
    int i = 0;
    int j = 0;

    for (i = 1;i<len;++i)               // 控制趟数
    {
        for(j = 0;j<len-i;++j)          //一趟的比较过程
        {
            if(a[j]>a[j+1])
            {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }

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

    return 0;
}

3.插入排序

 思想:首先把第一个位置上的数假设为最小数,用a[1]位置上的数与他比较,如果a[1]上的数比它小,则将a[0]的值赋给a[1]将a[1]的值放在a[0]的位置,再用a[2]与a[1]比较,如果·a[2]比它小则交换两个数,再把它与a[0]上的数比较,如此循环,直到最后两个数比较完。

#include<stdio.h>

int main(void)
{
    int a[] = {3,2,5,4,1,8,6,9,7};
    int len = sizeof(a)/sizeof(a[0]);
    int i = 0;
    int j = 0;

    for(i = 1;i < len;++i)            
    {
        int t = a[i];                // 拿数,记录此时 i 位置上的值
        j = i;                       // 准备要放的位置

        while(j>0 && t<a[j-1])       // 将 i 位置上的值依次与前面的数进行比较,直到有一个数比t        
                                        小或者到了a[0]的位置
        {
            a[j] = a[j-1];           // 挪位置
            --j;
        }
        a[j] = t;
    }

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

    return 0;
}

4.查找

4.1 二分查找

前提:数据得是有序的。

思想:先找到中间位置的数,用这个数和要找的数比较。(每次折一半,直到找到对应数组,或者结束),如果输入的数比中间数小,则输入数在数组的前一半,缩小范围,如果输入的数比中间数大,则表示输入数在数组的后一半,缩小范围继续查找。

#include<stdio.h>

int main(void)
{
    int a[] = {1,2,3,4,5,6,7,8,9};
    int len = sizeof(a)/sizeof(a[0]);
    int begin = 0;
    int end = len-1;

    int n;
    printf("Input a num:");
    scanf("%d",&n);

    while(begin <= end)                
    {
        int mid = (begin+end)/2;

        if(n>a[mid])
        {
            begin = mid + 1;            // 要查找的数比中间的数大,说明要找的数在后面一半,缩 
                                           小区间
        }else if(n<a[mid])
        {
            end = mid - 1;              // 要查找的数比中间的数小,说明要找的数在前面面一半, 
                                           缩小区间
        }else                           // 要找的数和中间值相等,表示找到了
        {
            break;
        }
    }

    if(begin <= end)                    // 如果成立表示是从前面break出来的
    {
        printf("找到了!\n");
    }else
    {
        printf("没有这个数!\n");
    }

    return 0;
}

运行结果:

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值