演算法一步一步走之選擇排序

2021-09-29 05:51:20 字數 4261 閱讀 8704

選擇排序(selection sort)是一種簡單直觀的排序演算法。

它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素。

存放在序列的起始位置。

然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

以此類推,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法.

對一組陣列進行排序。

private static int array=;

可以看到我們的需求是對這些數字進行排序。

但這裡先只對其中的一部分:正數,做排序。

private static int arr = ;

**如下:

private static int arr = ;

public static void main(string args)

}system.out.format("最小的數字為::%d",min);

}最小的數字為::0

那麼這裡就是有問題的了。

如果我們的數字裡不包含0的話,這裡始終得不到真正的最小值的。

我們對它進行修改:

private static int arr = ;

public static void main(string args)

}system.out.format("最小的數字為::%d\n",min);

}最小的數字為::1

然後,正式進行排序的時候

那麼我們正式對這部分資料進行排序,但是排序的時候又出問題了???啥子情況

private static int arr = ;

public static void main(string args)

}// 交換位置

int temp = arr[index];

arr[index] = arr[j];

arr[j] = temp;

system.out.format("最小的數字位置::%d\n",index);

system.out.format("jde 位置::%d\n",j);

system.out.format("排序之後::%s\n", arrays.tostring(arr));

system.out.println("----------------");}}

排序之qian::[9, 8, 7, 5, 6, 4, 1, 9, 2, 3]

最小的數字位置::6

jde 位置::0

排序之後::[1, 8, 7, 5, 6, 4, 9, 9, 2, 3]

----------------

排序之qian::[1, 8, 7, 5, 6, 4, 9, 9, 2, 3]

最小的數字位置::8

jde 位置::1

排序之後::[1, 2, 7, 5, 6, 4, 9, 9, 8, 3]

----------------

排序之qian::[1, 2, 7, 5, 6, 4, 9, 9, 8, 3]

最小的數字位置::9

jde 位置::2

排序之後::[1, 2, 3, 5, 6, 4, 9, 9, 8, 7]

----------------

排序之qian::[1, 2, 3, 5, 6, 4, 9, 9, 8, 7]

最小的數字位置::5

jde 位置::3

排序之後::[1, 2, 3, 4, 6, 5, 9, 9, 8, 7]

----------------

排序之qian::[1, 2, 3, 4, 6, 5, 9, 9, 8, 7]

最小的數字位置::5

jde 位置::4

排序之後::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]

----------------

排序之qian::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]

最小的數字位置::0

jde 位置::5

排序之後::[6, 2, 3, 4, 5, 1, 9, 9, 8, 7]

// 這裡排序之後,我擦,怎麼回事??

----------------

排序之qian::[6, 2, 3, 4, 5, 1, 9, 9, 8, 7]

最小的數字位置::9

jde 位置::6

排序之後::[6, 2, 3, 4, 5, 1, 7, 9, 8, 9]

----------------

排序之qian::[6, 2, 3, 4, 5, 1, 7, 9, 8, 9]

最小的數字位置::8

jde 位置::7

排序之後::[6, 2, 3, 4, 5, 1, 7, 8, 9, 9]

----------------

排序之qian::[6, 2, 3, 4, 5, 1, 7, 8, 9, 9]

最小的數字位置::0

jde 位置::8

排序之後::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]

----------------

排序之qian::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]

最小的數字位置::0

jde 位置::9

排序之後::[9, 2, 3, 4, 5, 1, 7, 8, 6, 9]

----------------

好吧。發現問題。這之後的時候,不時出現最小數字位置為:0的語句。之後就會和陣列的第一位的數字進行交換。

那麼我們就觀察,發現,index是決定最小數字位置的。在這裡會出現幾次最小數字位置為0的情況。

如果它是0的話。說明

if(min > arr[i])
這段比較結果為false。index的值是什麼呢,還是0,保持不變。

這時候發現

排序之qian::[1, 2, 3, 4, 5, 6, 9, 9, 8, 7]

最小的數字位置::0

jde 位置::5

如果我們進行比較的話,就是

arr[j];j = 5;

// 6 > 6,6 > 9,6 > 9,6 > 8,6 > 7

if(6 > 6)

經過修改之後,發現我們不知min需要隨著j變化而變化,還有index,也需要:修改後的**如下:

int min = 0;

for (int j = 0; j < arr.length; j++)

}// 交換位置

int temp = arr[index];

arr[index] = arr[j];

arr[j] = temp;

}

這裡修改 index的初始值為 j。應對,如果第一位就是最小數字的情況。

最終的輸出結果為:

排序之後::[1, 2, 3, 4, 5, 6, 7, 8, 9, 9]
那到這裡,我們的正數排序就完成了。

接下來看看,帶負數的排序。

private static intarray=;
第一邊,直接用原來的方法排序:

排序之後::[-111, -9, -8, -1, 0, 1, 3, 4, 5, 7, 8, 9, 9, 16]
額,一邊就好的嗎???

好吧。這次很順利。之前在家裡寫遇到了別的問題。具體情況參考 index 的位置。

是min出現了問題。min的值每次都賦值:0。

因為有負數,每次min記錄的都是0,在對負數排序之後,在正數中 0 是最小的。所以導致負數之後排序中的數字位置都變成了0。

這裡也是這樣。只不過換了個形式。

另一邊的解決方案是:

if(min > array[i])

// 記錄最大的數值的位置

if(min < array[i])

// 交換位置

// 略 。。。 。。。

// 這裡將min的值記錄成為最大值。

min = max;

這就是我看選擇排序絕噹自己實現的經歷以及遇到的一些情況。

當然,這裡沒有遇到負數排序的問題。

這裡是自己公司午休的時間寫的,遇到的新問題。以及倆個問題之間的總結。相似而不相同。

走一步,再走一步

時光如梭,匆匆流逝的所有,讓我再一次懂得了,人生的時光門票,在不斷的穿梭過去和未來,也任光陰的手撫摸著這個現在,有太多的好像,早已和我的過去劃開了界限,無論悲傷的過往,還是美好而快樂過的曾經,都好像已經不重要了。重要的是,走一步,再走一步。這場在歲月裡一直奔跑的故事,和那始終無法為自己畫上成功圓滿的...

一步一步向前走

一直以來都沒有開始寫部落格,最近開始轉技術方向,所以想記錄下後面的心路歷程。其實,也不算是轉技術方向,因為,這個方向也屬於自己職業規劃的一部分。本人本科學歷,電子資訊工程專業,目前從事應用軟體開發工作,現打算轉向驅動及linux核心開發。未踏足社會時,就想著自己應該成為乙個,能從無到有開發並推出產品...

一步一步寫演算法(之堆排序)

堆排序是另外一種常用的遞迴排序。因為堆排序有著優秀的排序效能,所以在軟體設計中也經常使用。堆排序有著屬於自己的特殊性質,和二叉平衡樹基本是一致的。打乙個比方說,處於大堆中的每乙個資料都必須滿足這樣乙個特性 1 每乙個array n 不小於array 2 n 2 每乙個array n 不小於array...