n個數的選擇排序是一個兩重循環的問題:外循環控制求最小值得次數,n個數求最小值,要用n-1循環;內循環是用來完成求最小值的過程,假定當前元素a[i]是最小值,假設內循環變量是j讓a[i]與其後的全部元素a[j]逐個比較,i+1<=j<=n-1;算法
1 for(i=0;i<n-1;i++) 2 { 3 for(j=i+1;j<=n-1;j++) 4 { 5 if(a[i]>a[j]) 6 { 7 t=a[i]; 8 a[i]=a[j]; 9 a[j]=t; 10 } 11 } 12 }
雖然上述代碼能獲得結果,可是仍是有缺陷,對於10,9,8,7,6,5,4,3,2,1這樣10個要排序的序列來講,元素a[0]須要與後面的每一個元素都要比較,這是很影響運行效率的。下面咱們來介紹改進算法:spa
每次找最小值最多隻須要一次交換,即初始位置的元素與最小值元素交換。這樣在找最小值過程當中,就要把最小值的位置標記下來,所以能夠定義一個標記變量,來標記本輪比較中最小值的位置,開始假設初始元素最小,將其下標做爲標記變量的初始值。而後讓後面的全部元素與標記的最小值作比較,若是比最小值還小,只須要更新最小值下標賦值變量。當外層循環結束後,判斷標記變量的位置,若是再也不指向初始元素,說明最小值不在初始位置,這時讓初始元素與標記變量所標記位置的元素作一次交換就行,不然不用交換。下面看一下代碼:code
1 for(i=0;i<n-1;i++) 2 { 3 k=i;//標記變量的初始化,假設初始元素最小 4 for(j=i+1;j<=n-1;j++) 5 { 6 if(a[k]>a[j])//若是後面的元素小於最小值,則將其下標賦值給變量 7 { 8 k=j; 9 } 10 } 11 if(k!=i) 12 { 13 t=a[k]; 14 a[k]=a[i]; 15 a[i]=t; 16 } 17 }
選擇排序的改進算法----二元選擇排序blog
簡單的選擇排序,每趟循環只能肯定一個元素排序後的定位,咱們能夠考慮改進爲每趟循環肯定兩個兩個元素(當前的最大記錄和最小記錄)的位置,從而減小排序所需的循環次數。代碼以下:排序
1 for(i=1;i<=n/2;i++) 2 { 3 //分別記錄最大值和最小值的位置 4 min=i; 5 max=i; 6 for(j=i+1;j<=n-i;j++) 7 { 8 if(a[j]>a[max]) 9 { 10 max=j;continue; 11 } 12 if(a[j]<a[min]) 13 { 14 min=j; 15 } 16 } 17 t=a[i-1];a[i-1]=a[min];a[min]=t; 18 t=a[n-i];a[n-i]=a[max];a[max]=t; 19 } 20