1. 程式人生 > >6.2

6.2

需要 什麽是 阿姆斯特朗數 序列 二叉排序樹 兩個 高精 找到 ket

一、什麽是水仙花數

水仙花數只是自冪數的一種,嚴格來說3位數的3次冪數才稱為水仙花數。

附:其他位數的自冪數名字

一位自冪數:獨身數

兩位自冪數:沒有

三位自冪數:水仙花數

四位自冪數:四葉玫瑰數

五位自冪數:五角星數

六位自冪數:六合數

七位自冪數:北鬥七星數

八位自冪數:八仙數

九位自冪數:九九重陽數

十位自冪數:十全十美數

常見水仙花數

水仙花數又稱阿姆斯特朗數。

三位的水仙花數共有4個:153,370,371,407;

四位的四葉玫瑰數共有3個:1634,8208,9474;

五位的五角星數共有3個:54748,92727,93084;

六位的六合數只有1個:548834;

七位的北鬥七星數共有4個:1741725,4210818,9800817,9926315;

八位的八仙花數共有3個:24678050,24678051,88593477

……

使用高精度計算,可以得到超過int類型上限的水仙花數:

5: 93084

5: 92727

5: 54748

6: 548834

7: 9800817

7: 4210818

7: 1741725

7: 9926315

8: 24678050

8: 24678051

8: 88593477

9: 146511208

9: 912985153

9: 472335975

9: 534494836

10: 4679307774

11: 32164049650

11:40028394225

11: 42678290603

11: 49388550606

11: 32164049651

11: 94204591914

11: 44708635679

11: 82693916578

14: 28116440335967

16: 4338281769391370

16: 4338281769391371

17: 21897142587612075

17: 35641594208964132

17: 35875699062250035

19: 1517841543307505039

19: 3289582984443187032

19: 4929273885928088826

19: 4498128791164624869

20: 63105425988599693916

21: 449177399146038697307

21: 128468643043731391252

23: 27907865009977052567814

23: 35452590104031691935943

23: 27879694893054074471405

23: 21887696841122916288858

24: 174088005938065293023722

24: 188451485447897896036875

(為環保起見,24位以上的水仙花數略)

最大的水仙花數有39位。十進制自然數中的所有水仙花數共有88個。

用法

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<script type="text/javascript">

var a = 0, b = 0, c = 0;

for (var i = 100; i < 1000; i++)

{

a = i % 10;

b = parseInt(((i / 10) % 10));

c = parseInt(i / 100);

if (i === a * a * a + b * b * b + c * c * c)

{

document.write(‘水仙花數: ‘ + i + ‘<br/>‘);

}

}

</script>

</body>

</html>

二、排序

排序(Sorting) 是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。

分類

穩定的

冒泡排序(bubble sort) — O(n^2)

雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2)

插入排序(insertion sort)— O(n^2)

桶排序(bucket sort)— O(n); 需要 O(k) 額外空間

計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間

合並排序(merge sort)— O(nlog n); 需要 O(n) 額外空間

原地合並排序— O(n^2)

二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間; 需要 O(n) 額外空間

鴿巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 額外空間

基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間

Gnome 排序— O(n^2)

圖書館排序— O(nlog n) with high probability,需要 (1+ε)n額外空間

不穩定的

選擇排序(selection sort)— O(n^2)

希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本

組合排序— O(nlog n)

堆排序(heapsort)— O(nlog n)

平滑排序— O(nlog n)

快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況; 對於大的、亂數列表一般相信是最快的已知排序

Introsort— O(nlog n)

Patience sorting— O(nlog n+ k) 最壞情況時間,需要 額外的 O(n+ k) 空間,也需要找到最長的遞增子串行(longest increasing subsequence)

不實用的

Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。

Stupid sort— O(n^3); 遞歸版本需要 O(n^2) 額外存儲器

珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬件

Pancake sorting— O(n),但需要特別的硬件

stooge sort——O(n^2.7)很漂亮但是很耗時

三、冒泡排序

冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。

它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。

原理:

冒泡排序算法的運作如下:(從後往前)

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重復以上的步驟,除了最後一個。

持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

JavaScript

function bubbleSort(arr) {

var i = arr.length, j;

var tempExchangVal;

while (i > 0) {

for (j = 0; j < i - 1; j++) {

if (arr[j] > arr[j + 1]) {

tempExchangVal = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = tempExchangVal;

}

}

i--;

}

return arr;

}

var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];

var arrSorted = bubbleSort(arr);

console.log(arrSorted);

alert(arrSorted);

四、選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。

選擇排序法的第一層循環從起始元素開始選到倒數第二個元素,主要是在每次進入的第二層循環之前,將外層循環的下標賦值給臨時變量,接下來的第二層循環中,如果發現有比這個最小位置處的元素更小的元素,則將那個更小的元素的下標賦給臨時變量,最後,在二層循環退出後,如果臨時變量改變,則說明,有比當前外層循環位置更小的元素,需要將這兩個元素交換.

選擇排序是這樣實現的:

1、設數組內存放了n個待排數字,數組下標從1開始,到n結束。

2、初始化i=1

3、從數組的第i個元素開始到第n個元素,尋找最小的元素。

4、將上一步找到的最小元素和第i位元素交換。

5、i++,直到i=n-1算法結束,否則回到第3步

選擇排序的平均時間復雜度也是O(n^2)的。

舉例:

564

比如說這個,我想讓它從小到大排序,怎麽做呢?

第一步:從第一位開始找最小的元素,564中4最小,與第一位交換。結果為465

第二步:從第二位開始找最小的元素,465中5最小,與第二位交換。結果為456

第三步:i=2,n=3,此時i=n-1,算法結束

完成

6.2