ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《啊哈,算法》第一节

2021-11-13 16:31:37  阅读:118  来源: 互联网

标签:10 temp int 第一节 while 算法 啊哈 排序 left


一、排序

1、桶排序(简化版)

如:对 5,3,5,2,8 进行排序

初始化:申请一个大小为10的数组 int a[10],并将a[0]~a[10]初始化为0;

    for (i = 0; i <= 10; i++)
    {
        a[i] = 0;
    }

在这里插入图片描述
记录次数:进行for循环,用a[i]的值记录5,3,5,2,8这几个数出现的次数;

    for (i = 1; i <= 10; i++)
    {
        scanf("%d", &t);
        a[t]++;
    };

在这里插入图片描述
输出

  • for (i = 0; i <= 10; i++)代表从小到大输出
// 从小到大
    for (i = 0; i <= 10; i++)
    {
        for (j = 1; j <= a[i]; j++)
        {
            printf("%d ", i);
        }
    }
  • for (i = 10; i >= 0; i–)代表从大到小输出
    // 从大到小
    for (i = 10; i >= 0; i--)
    {
        for (j = 1; j <= a[i]; j++)
        {
            printf("%d ", i);
        }
    }

2、冒泡排序

核心思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来

如:对 5,3,5,2,8进行排序

第一位需要执行4次交换,第二位需要执行3次交换,第三位需要执行2次交换,第四位需要执行1次交换,一共4趟;
总结:n个数,需要n-1趟,第i趟执行n-i次交换

for (i = 1; i <= n - 1; i++)  // 外层决定趟数
    {
        for (j = 1; j <= n - i; j++)  // 内层决定交换次数
        {
            if (a[j] < a[j + 1])  //对相邻的数进行交换
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }

3、快速排序

对 6 1 2 7 9 3 4 5 10 8 这10个数进行排序

首先在这个序列中随便找一个数作为基准数,这里把6作为基准数,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在 6的左边,如下:
在这里插入图片描述
实现方法:

  • 初始化数组int a[10] = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
  • 初始化基准数int temp = a[1];
  • 初始化两个变量int i = 1 , j =10;

在这里插入图片描述

  • 先让j--,当移动到大于6的数,再让i++,当移动到小于6的数时,将a[i],a[j]进行交换;
while (i != j)
    {
        while (a[j] >= temp && j > i)
        {
            j--;
        };
        while (a[i] <= temp && i < j)
        {
            i++;
        }
        if (i < j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

当i与j重合时,再将a[i]=a[j]temp进行交换
在这里插入图片描述

然后再对6两边的序列进行相同的处理;
根据该思想封装的函数如下:

// 4_快速排序
#include <stdio.h>
int a[101], n;
void quicksort(int left, int right)
{
    int i, j, t, temp;
    if (left > right) // 结束递归的条件
    {
        return;
    }
    temp = a[left];
    i = left;
    j = right;

    while (i != j)
    {
        while (a[j] >= temp && j > i)
        {
            j--;
        };
        while (a[i] <= temp && i < j)
        {
            i++;
        }
        if (i < j)
        {
            t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
    a[left] = a[i];      a[i] = temp;
    quicksort(left, i - 1);  // 处理基准数左边的
    quicksort(i + 1, right); // 处理基准数右边的
    return;
}

int main()
{
    int i;

    scanf("%d", &n);

    for (i = 1; i <= n; i++)

    {

        scanf("%d", &a[i]);
    }

    quicksort(1, n);
    for (i = 1; i <= n; i++)
    {
        printf("%d ", a[i]);
    }

    return 0;
}

标签:10,temp,int,第一节,while,算法,啊哈,排序,left
来源: https://blog.csdn.net/qq_45467524/article/details/121305169

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有