選擇排序

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     
相關文章
相關標籤/搜索