一步一步寫演算法(之挑選最大的n個數)

2021-08-31 17:45:23 字數 1466 閱讀 3875

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

從一堆資料中挑選n個最大的數,這個問題是網上流傳的比較廣的幾個問題之一。具體來說,它的意思就是:假設我們有100個資料,我們需要挑選出最大的n個資料(n < 100),那麼有沒有辦法實現這樣乙個目標呢?在這裡,我想從排序的角度看看有沒有什麼辦法可以實現這樣乙個目標。

在前面的部落格當中,我們實現的排序演算法有下面幾種:

(1) 氣泡排序、插入排序、希爾排序

(2) 快速排序

(3) 合併排序

(4) 堆排序

(5)選擇排序

(6) 基數排序

那麼是不是這8種演算法都適合今天的題目呢?我簡單的對它們進行了分析和歸類:

a)不到最後無法求出最大資料的演算法,(插入演算法,合併演算法,基數排序)

這些演算法的特點就是可以保證區域性的資料基本有序,但是無法保證全域性的資料有序。在全部資料得到正確地排序之前,沒有人知道最大的資料是什麼。所以針對這個題目而言,要想知道最大的n個數,那就等於要對所有的資料全部排序一遍。

b)每次求出乙個最大的資料,依次類推,直到所有的資料都已經排序。(氣泡排序、希爾排序、選擇排序、堆排序)

這些演算法的特點就是,排序的時候,所有的資料都是按照從大到小排列出來的。按照氣泡排序來說,首先我們選出最大的資料,然後是第二大的資料,依次類推,直到第n大的資料找到為止。堆排序也是這樣,我們在構建堆之後,也是每次從堆頂獲得乙個資料,不斷調整堆,再接著獲得第二大、第三大......第n大的資料的。我們以氣泡排序為例,看看這一次的演算法應該怎麼寫?

void

find_n_max_number

(int

array, int length, int number)

} }}

快速排序)

不知道上面的解釋說明白了沒,沒有清楚的同學可以看一看下面這個**。

int

partion

(int

array, int start, int end, int swap)

swap[left] = value; memmove(&array[start], swap, sizeof(int) * (end - start +1)); return left + start;}void _quick_sort(int

array, int start, int end, int swap, int number)}void

find_n_max_number

(int

array, int length, int number)

總結:至於這些演算法的結果怎麼樣,各位朋友們可以自己利用自己的電腦好好測試一下。

給我老師的人工智慧教程打call!

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法 之 A 演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...