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