選擇排序的細節問題

2021-10-09 23:43:07 字數 1931 閱讀 2904

對乙個陣列進行選擇排序,**如下:

#include

//交換函式

template

<

class

t>

void

swap

(t & a,t & b)

//索引最大值函式

template

<

class

t>

intindexofmax

(t a,

int n)

return indexofmax;

}//函式排序

template

<

class

t>

void

selectionsort

(t a,

int n)

}int

main()

;selectionsort

(a,10);

for(

int i =

0; i <10;

++i)

return0;

}//執行結果0,

1,2,

3,4,

5,6,

7,8,9

以上是常規的排序**,在交換函式的地方我一開始採用的是不借助第三個數而是值依靠兩個數運算進行交換,**如下:

#include

//這裡的交換函式

template

<

class

t>

void

swap

(t & a,t & b)

template

<

class

t>

intindexofmax

(t a,

int n)

return indexofmax;

}template

<

class

t>

void

selectionsort

(t a,

int n)

}int

main()

;selectionsort

(a,10);

for(

int i =

0; i <10;

++i)

return0;

}//執行結果0,

0,0,

0,0,5,6,

7,8,

9

一開始對結果很困惑,只能一步一步除錯,發現當交換排序進行5輪後陣列已經是有序陣列了,所以交換函式變為swap(a[4],a[4])、swap(a[3],a[3])、swap(a[2],a[2])、swap(a[1],a[1])、swap(a[0],a[0]),呼叫交換函式是會導致a=a[4]=b,所以執行完swap函式後變為a=b=a[4]=0,後面的數也是相同的原理。

若採取及時終止的選擇排序就不會產生這個問題,**如下:

#include

template

<

class

t>

void

swap

(t & a,t & b)

template

<

class

t>

void

selectionsort

(t a,

int n)

swap

(a[indexofmax]

,a[size-1]

);}}

intmain()

;selectionsort

(a,10);

for(

int i =

0; i <10;

++i)

return0;

}

快速排序 quicksort 細節問題

cpp view plain copy include using namespace std template class elementtype intquickpart elementtype iarray,intfirst,intlast iarray i temp return i tem...

選擇排序問題

選擇排序問題 剛開始做的時候理解錯誤,大概用了插空排序的思想,這裡不進行展示,等到插孔排序時直接說明。void select int arr,const int len 選擇排序 int tmp int dmin for int i 0 i定義乙個中間變數在交換的時候使用,定義乙個變數儲存最小值的下...

簡單選擇排序的幾種實現和細節

選擇排序是每次遍歷整個序列,選出其中最小的放在已排序部分的最後,所以每次排序可以讓待排序區域的數量減少乙個。所以實現也無非就是while迴圈和for迴圈,在交換最小值的細節上可以有兩種處理方式。這種方式在每一次遍歷過程中,用乙個變數儲存最小值的下標,在遇到更小的值時,替換這個下標,在一趟比較結束後,...