標籤:iostream 變數 第一個 pad main 數組 code log namespace
基本選擇排序編輯排序演算法即解決以下問題的演算法:輸入n個數的序列<a1,a2,a3,...,an>。輸出原序列的一個重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*排序演算法有很多,包括插入排序,冒泡排序,堆排序,歸併排序,選擇排序,計數排序,基數排序,桶排序,快速排序等。插入排序,堆排序,選擇排序,歸併排序和快速排序,冒泡排序都是比較排序,它們通過對數組中的元素進行比較來實現排序,其他排序演算法則是利用非比較的其他方法來獲得有關輸入數組的排序資訊。思想n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:①初始狀態:無序區為R[1..n],有序區為空白。②第1趟排序在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。……③第i趟排序第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。通俗的解釋對比數組中前一個元素跟後一個元素的大小,如果後面的元素比前面的元素小則用一個變數k來記住他的位置,接著第二次比較,前面“後一個元素”現變成了“前一個元素”,繼續跟他的“後一個元素”進行比較如果後面的元素比他要小則用變數k記住它在數組中的位置(下標),等到迴圈結束的時候,我們應該找到了最小的那個數的下標了,然後進行判斷,如果這個元素的下標不是第一個元素的下標,就讓第一個元素跟他交換一下值,這樣就找到整個數組中最小的數了。然後找到數組中第二小的數,讓他跟數組中第二個元素交換一下值,以此類推。代碼實現:
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#define SIZE 15using namespace std;void selectSort(int *a, int len){ int h; int tmp; for(int i=0; i<SIZE-1; i++){ int k=i; for(int j=i+1; j<len; j++){ if(a[j]<a[k]) k=j; } if(k!=i){ tmp=a[i]; a[i]=a[k]; a[k]=tmp; } cout<<"第"<<i<<"步排序結果為:"; for(int h=0; h<len ; h++){ cout<<a[h]<<" "; } cout<<endl; }}int main(){ int array[SIZE]; srand(time(NULL)); for(int i=0 ;i<SIZE; i++){ array[i]=rand()/1000+100; } cout<<"排序前的序列為:"<<endl; for(int i=0; i<SIZE; i++){ cout<<array[i]<<" "; } cout<<endl<<endl; selectSort(array, SIZE); cout<<endl; cout<<"排序後的序列為:"<<endl; for(int i=0; i<SIZE; i++){ cout<<array[i]<<" "; } return 0;} |
運行結果:
【資料結構】選擇排序演算法樣本