排序演算法之選擇排序

2021-07-11 19:57:28 字數 1691 閱讀 6305

我們經常能遇到這樣的問題,讓你對一串資料進行排序,比如對乙個陣列,對順序表等等進行排序。排序的方法有很多,你可以任意選擇,只要能達到人家所要求的效果。一說到排序,對我來說最熟悉的就是氣泡排序,對於氣泡排序只要你掌握好了兩個迴圈的條件其實很簡單,今天我們談談另外一種排序演算法:選擇排序。

首先我們來說說選擇排序的原理,我們還是要用兩層for迴圈,外迴圈代表迴圈的次數,內迴圈是每次迴圈進來還要比較的次數。請看下面的圖:首先我們把陣列的第乙個位置也就是位置0設為maxpos和minpos,然後再用乙個迴圈進行陣列內內容的比較,如果有比maxpos位的數大的,則更正我們的maxpos,這樣比較完一次我們可以找到存最大的數的乙個位置,比如下圖中,我們最後找到了存放5的位置,也就是位置4,則maxpos=4.

我下面的程式是改進了之後的選擇排序,就是在進行比較的時候,同時更正minpos的值,這樣我們的外層迴圈就被簡化為原來次數的一半。如果不加改進其實寫起來很簡單,只需要定乙個maxpos就夠了。在這裡就不寫了。

當一次比較完成後,我們就進行交換,假如現在是公升序排序。把maxpos上的值和最右邊位置的值進行交換,把minpos上的值和最右邊位置的值進行交換。從而達到排序的效果。

但是我這樣優化了之後也會存在乙個問題,就是一次更正後要對maxpos上的值和minpos上的值分別交換到需要的位置上,那麼如果剛好我maxpos上的值要交換的位置剛好就是我的minpos,那麼我們在交換的時候就會把本來minpos上的值換走了,等你在對minpos上的值進行移動的時候肯定就不是我們想要的結果了。比如下面的情況:內迴圈完成之後,得到的maxpos是0,minpos是3,然後如果不進行別的處理,最大值5要被我和最右邊位置的1進行交換,之後minpos上的值就變成5了,接下來的交換肯定就不對了。

所以在進行交換前我們就要進行判斷,如果存在這樣的問題,就把此時的maxpos和minpos上的值交換,同時也把minpos和maxpos進行交換。

下面是選擇排序的程式**,紅色部分就是判斷上面所述的特殊情況進行的處理。自己寫的,肯定有很多地方比較麻煩希望見諒,大家有什麼好的建議可以提出。

1

#define _crt_secure_no_warnings

2 #include 3 #include4 #include

5 #include6

7void selectsort(int *str,int

len)

823 if (len - i - 1 == minpos)

24

32if (len - i - 1 !=maxpos)

3338

if (i !=minpos)

3944}45

}4647int

main()48;

51int len = sizeof(str) / sizeof(str[0

]);52

selectsort(str,len);

53for (; i < len; i++)

5457

58 system("

pause");

59return0;

60 }

排序演算法 排序演算法之選擇排序

最近在學習排序演算法,就排序演算法中的四大經典排序 氣泡排序 快速排序 選擇排序 插入排序。會出一系列的講解排序演算法的部落格。今天繼快速排序之後整理一下選擇排序。選擇排序,就是從一列未排序的陣列中先選出最小 最大 的數,放在陣列的第一位,第一位原來的數字放在最小的原來的位置,再選出第二小的數,放在...

排序演算法之選擇排序 選擇排序 堆排序

直接選擇排序 如下 下面 是一次迴圈同時挑選出最大和最小數,並將其與左右交換 選擇排序 void selectionsort int a,int len swap a min a left 如果最大數的下標在為left,證明要交換的最大數已經被 換到min小標所表示的位置,只需要將right和min...

排序演算法之選擇排序

選擇排序 在乙個長度為n的無序陣列中,在第一趟遍歷n個資料,找出其中最小的數值與第乙個元素交換,第二趟遍歷剩下的n 1個資料,找出其中最小的數值與第二個元素交換.第n 1趟遍歷剩下的2個資料,找出其中最小的數值與第n 1個元素交換,至此選擇排序完成。平均時間複雜度 o n2 空間複雜度 o 1 用於...