Skip to content

Instantly share code, notes, and snippets.

@ismdeep
Last active September 24, 2020 08:38
Show Gist options
  • Save ismdeep/5b38b0310d42e91f75400e6e15662834 to your computer and use it in GitHub Desktop.
Save ismdeep/5b38b0310d42e91f75400e6e15662834 to your computer and use it in GitHub Desktop.
一个选择排序的演化过程。
从最简单的C语言基础开始,一步一步编写一个选择排序(从小到大)的程序。
@ismdeep
Copy link
Author

ismdeep commented Sep 24, 2020

#include <stdio.h>
#include <stdlib.h>

void print_arr(int a[], int n) {
    printf("[");
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("]");
    printf("\n");
}

void core(int a[], int l, int r) {
    for (int i = l + 1; i <= r; i++) {
        if (a[i] < a[l]) {
            int t = a[i];
            a[i] = a[l];
            a[l] = t;
        }
    }
}

void sort(int a[], int n) {
    for (int i = 0; i <= n - 2; i++) {
        core(a, i, n - 1);
    }
}

int main() {
    int n;
    int *a;
    scanf("%d", &n);
    a = (int *) malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    print_arr(a, n);
    sort(a, n);
    print_arr(a, n);
    return 0;
}

程序输入:

9
5 1 3 2 8 13 98 21 1

第一行的数字9表示需要排序的数组一共有多少个数字。
第二行9个数字,一次表示数组中各个元素的值。

程序输出:

[5 1 3 2 8 13 98 21 1 ]
[1 1 2 3 5 8 13 21 98 ]

两行输出数组对应着两次 print_arr 函数的调用。

第一行是原始数组。

第二行是排序后的数组。

@ismdeep
Copy link
Author

ismdeep commented Sep 24, 2020

这个排序往后面还有更多的思考以及更多的程序实现可以写。比如:

  • 程序输入上面,如何实现输入一行数字然后对这行数字进行排序。(毕竟输入搞成两行并不太友好,我们想更加随意一些,让程序判断我输入的数字有多少个,而不是我们去告诉程序。)
  • 如何实现排序函数既可以从小到大也可以从大到小排序,可以通过什么样的方式告诉这个程序该怎么做。
  • 如何实现排序函数让程序员在使用这个排序函数进行排序时,可以自定义排序规则,比如:我想利用这个函数对一组数字排序,这组数字排序是按照绝对值从小到大进行排序。但是我调用这个排序函数时却不去改变这个排序函数内部对源代码。该如何实现呢?(这样实现的函数将变得更加灵活,可用性更强。)
  • 我看输出函数有些不爽,我想将数组转化成字符串,然后再输出。这样我们如果想将数组保存至文本,保存至数据库,就可以调用将数组转化成字符串的函数,接下来再拿字符串去处理。函数拆分开来好处这里就能体现出来了。
  • 这个程序解决的是固定类型数据排序,只能处理 int 类型的数组排序,那如何实现一个函数可以对任意类型元素的数组进行排序呢?
  • ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment