算法学习笔记(三)《选择排序》

写在前面

本文学习内容来自《算法图解》一书及百度百科内容

算法是一组完成任务的指令。任何代码片段都可视为算法。 —— 摘自《算法图解》


选择排序

以下内容摘自百度百科
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

思路梳理

    假如你现在在一家新闻媒体公司工作,今天一共有5条新闻,老板现在叫你把这5条新闻按照浏览量最多的排在前面,
你会怎么去做?
新闻标题 浏览量
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 3336
2.唐嫣被问想不想变矮一点,她的回答很耿直 14564
3.“逃犯克星”张学友将在洛阳开唱 警方:已准备好 42214
4.燃爆禾城—浙江康润助力张学友演唱会 8322
5.王大陆为张杰打call:认识了全世界最好男人 25584

一般我们会这样去实现这个需求:

  1. 遍历这个5条记录。
  2. 找出其中浏览量最大的放在一旁,放在一个新的地方,排在最前面。
  3. 从这5条记录里把那一条删除。
  4. 重复123步骤,遍历剩下的4条。找出····

选择排序是根据指定的条件(最大值或者最小值),取决你要排序的顺序,然后在指定的数组中,找到这个条件,把它从指定的数组中提取出来,放到一个新的数组里面,并把它从源数组中删除。


源数组 对其进行筛选,找出浏览量最大值提取出来放在 新数组 ,并在源数组中将其删除

源新闻中第三条新闻的阅读数最高 : 42214 我们把它拿出来放到了新数组的第一位

新闻标题(源数组) 浏览量 新闻标题(新数组) 浏览量
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 3336 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) 42214
2.唐嫣被问想不想变矮一点,她的回答很耿直 14564
4.燃爆禾城—浙江康润助力张学友演唱会 8322
5.王大陆为张杰打call:认识了全世界最好男人 25584

然后是排名第二浏览量的第五条新闻 25584 ,取出后放在新数组的第二位

新闻标题(源数组) 浏览量 新闻标题(新数组) 浏览量
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 3336 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) 42214
2.唐嫣被问想不想变矮一点,她的回答很耿直 14564 2.王大陆为张杰打call:认识了全世界最好男人↑(5) 25584
4.燃爆禾城—浙江康润助力张学友演唱会 8322

接下来的数据中,浏览量最多的新闻是第三条, 14564 我们把它拿出来放在新数组的第三位

新闻标题(源数组) 浏览量 新闻标题(新数组) 浏览量
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 3336 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) 42214
4.燃爆禾城—浙江康润助力张学友演唱会 8322 2.王大陆为张杰打call:认识了全世界最好男人↑(5) 25584
3.唐嫣被问想不想变矮一点,她的回答很耿直↓(2) 14564

然后在把接下来最高的是 8322 我们把它取出,放在新数组的第三位

新闻标题(源数组) 浏览量 新闻标题(新数组) 浏览量
1.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 3336 1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好↑(3) 42214
2.王大陆为张杰打call:认识了全世界最好男人↑(5) 25584
3.唐嫣被问想不想变矮一点,她的回答很耿直↓(2) 14564
4.燃爆禾城—浙江康润助力张学友演唱会(4) 8322

最后再把浏览量最小的第一条新闻,放在新数组的最后一位。至此完成了我们的《选择排序》

新闻标题(新数组) 浏览量
1.“逃犯克星”张学友将在洛阳开唱 警方:已准备好 ↑(3) 42214
2.王大陆为张杰打call:认识了全世界最好男人 ↑(5) 25584
3.唐嫣被问想不想变矮一点,她的回答很耿直 ↓(2) 14564
4.燃爆禾城—浙江康润助力张学友演唱会 (4) 8322
5.辣妈张嘉倪怀二胎气色好 眨眼卖萌很少女 ↓(1) 3336

代码实现

Java

private static int[] selectionSort(int[] ints) {
        int[] newInts = new int[ints.length];
        for (int i = ints.length - 1; i >= 0; i--) {
            int index = findBiggest(ints);
            newInts[i] = ints[index];
            ints = remove(ints, index);
        }
        return newInts;
    }

    private static int findBiggest(int[] ints) {
        int biggest = ints[0];
        int biggestIndex = 0;
        for (int i = 1; i < ints.length; i++) {
            if (ints[i] < biggest) {
                biggest = ints[i];
                biggestIndex = i;
            }
        }
        return biggestIndex;
    }

    private static int[] remove(int[] ints, int index) {
        int[] newArray = new int[ints.length - 1];
        if (index > 0) {
            System.arraycopy(ints, 0, newArray, 0, index);
            System.arraycopy(ints, index + 1, newArray, index, newArray.length - index);
        } else {
            System.arraycopy(ints, index + 1, newArray, 0, newArray.length);
        }
        return newArray;
    }


    public static void main(String[] args) {
        int[] ints = {3336, 14564, 42214, 8322, 25584};
        ints = selectionSort(ints);
        System.out.println("ints = " + Arrays.toString(ints));
    }

// ints = [42214, 25584, 14564, 8322, 3336]

python

def findBiggest(arry):
    biggest = arry[0]
    biggest_index = 0
    for index in range(1, len(arry)):
        if arry[index] > biggest:
            biggest = arry[index]
            biggest_index = index
    return biggest_index


def selectionSort(arry):
    resultArry = []
    for e in range(len(arry)):
        index = findBiggest(arry)
        resultArry.append(arry.pop(index))
    return resultArry


print('ints =', selectionSort([3336, 14564, 42214, 8322, 25584]))

# ints = [42214, 25584, 14564, 8322, 3336]

选择排序是一种灵巧的算法,但其速度不是很快。

猜你喜欢

转载自blog.csdn.net/sinat_34344123/article/details/80405141
今日推荐