Java教程

《啊哈,算法》第一节

本文主要是介绍《啊哈,算法》第一节,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、排序

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;
}
这篇关于《啊哈,算法》第一节的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!