直接選擇排序及交換二個資料的正確實現

2022-07-29 11:39:09 字數 966 閱讀 4757

直接選擇排序和直接插入排序類似,都將資料分為有序區和無序區,所不同的是直接插入排序是將無序區的第乙個元素直接插入到有序區以形成乙個更大的有序區,而直接選擇排序是從無序區選乙個最小的元素直接放到有序區的最後。

設陣列為a[0…n-1]。

1.      初始時,陣列全為無序區為a[0..n-1]。令i=0

2.      在無序區a[i…n-1]中選取乙個最小的元素,將其與a[i]交換。交換之後a[0…i]就形成了乙個有序區。

3.      i++並重複第二步直到i==n-1。排序完成。

直接選擇排序無疑是最容易實現的,下面給出**:

void selectsort(int a, int

n)}

inline void swap(int &a, int &b)

筆試面試時考不用中間資料交換二個數,很多人給出了

inline void swap1(int &a, int &b)

在網上搜尋下,也可以找到許多這樣的寫法。不過這樣寫存在乙個隱患,如果a, b指向的是同乙個數,那麼呼叫swap1()函式會使這個數為0。如:

int i = 6

;swap2(i, i);

printf(

"%d %d\n

", i);

當然誰都不會在程式中這樣的寫**,但回到我們的selectsort(),如果a[0]就是最小的數,那麼在交換時,將會出現將a[0]置0的情況,這種錯誤相信除錯起來也很難發現吧,因此建議大家將交換二數的函式寫成:

inline void swap(int &a, int &b)

或者在swap1()中加個判斷,如果二個資料相等就不用交換了:

inline void swap1(int &a, int &b)

}

直接選擇排序及交換二個資料的正確實現

設陣列為a 0 n 1 1.初始時,陣列全為無序區為a 0.n 1 令i 0 2.在無序區a i n 1 中選取乙個最小的元素,將其與a i 交換。交換之後a 0 i 就形成了乙個有序區。3.i 並重複第二步直到i n 1。排序完成。直接選擇排序無疑是最容易實現的,下面給出 void selects...

直接選擇排序及交換二個資料的正確實現

設陣列為a 0 n 1 1.初始時,陣列全為無序區為a 0.n 1 令i 0 2.在無序區a i n 1 中選取乙個最小的元素,將其與a i 交換。交換之後a 0 i 就形成了乙個有序區。3.i 並重複第二步直到i n 1。排序完成。直接選擇排序無疑是最容易實現的,下面給出 void selects...

指標的第二個資料的讀取

program a input,output varg file of longint buffer,buf char i,l longint f file r word begin assign g,temp.dat rewrite g for i 1 to 100 do begin write ...