【问题标题】:Selection Sort using a pointer and without loops使用指针且无循环的选择排序
【发布时间】:2021-05-21 00:09:59
【问题描述】:

我正在尝试使用递归函数按升序对数组进行排序。问题是我不能使用任何 for、while 或 do/while 循环。网上有很多选择排序资源,但我很难找到任何没有循环并且还包括指针的东西。

我正在尝试做的事情的简短一步。

  1. 将标记放置在数组的第一个元素处

2.如果标记指向数组的最后一个元素,则停止。否则继续

3.找到标记右边的最小元素

4.如果这个元素小于标记指向的元素,则交换

5.将标记前进到右侧的下一个元素

6.转到第 2 步

【问题讨论】:

    标签: c loops sorting pointers selection-sort


    【解决方案1】:

    至少,您可以使用循环设计它,并转换循环。

    任何循环都可以转换成如下形式:

    State state = init();
    while (cond(&state))
       body(&state);
    tail(&state);
    

    并且这个循环可以使用递归来简单地实现。

    void recursive(State *state) {
       if (!cond(state))
          return;
    
       body(state);
       recursive(state);
    }
    
    State = state = init();
    recursive(&state);
    tail(&state);
    

    也就是说,正面解决这个问题要容易得多。

    使用递归实现选择排序很简单。作为一个整体,您重复地对数组中不断缩小的部分进行排序。将第一个元素交换为最小元素后,您需要对数组的其余部分进行排序,这可以使用递归调用轻松完成。

    这让循环找到数组的最小元素。同样,根据其本身来定义这是微不足道的。列表的最小元素是第一个元素和列表其余部分中的最小元素。

    【讨论】:

    • 添加到我的答案中。
    • 我无法准确理解如何针对我的问题实施您的解决方案。你介意给我一个小数组的例子吗?也许 {5,6,3,1}。非常感谢。
    • 选择排序的例子? 1 和 5 交换得到 {1,6,3,5}。然后对 {6,3,5} 进行排序。交换 3 和 6,得到 {3,6,5}。然后对 {6,5} 进行排序。 5 和 6 交换得到 {5,6}。然后对 {6} 进行排序。完成。
    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2018-09-19
    相关资源
    最近更新 更多