淺談排序算法(二)之選擇排序

選擇排序是比較好理解的,交換操作在0和(n-1)之間,比較次數O(n^2);
其中交換次數最好情況是已排序,交換0次,最壞情況是逆序,交換n-1次,而冒泡排序最壞要交換n*(n-1)/2次。
選擇排序主要有兩個循環,外循環控制未排序的項,而內循環掃描出剩下未排序中的最大值(或最小值)
代碼一:

int comp_asc(int a, int b)  //升序
{
 return a - b;
}

int comp_desc(int a, int b)  //降序
{
 return  b - a;
}

int BingoSort(int array[], int size, compFun comp)     //選擇排序
{
 int temp, index;     //index用於保存最值的下標
 for(int i = 0; i < size - 1; i++)       // 有size個數要排,所以循環size - 1次就可以
 {
  index = i;
  for(int j = i + 1; j < size; j++)  //因爲從i開始就是未排序的,所以循環之後的數,得到最值
  {
   if(comp(array[index],array[j]) > 0)   //降序排列,如果array[j] > array[index],保存下標j
   {
    index = j;  
   }
  }
  //交換值
  temp = array[i];
  array[i] = array[index];
  array[index] = temp;
 }
 return 0;
}
bool test_sort(int *const array,int size)      //用於打印排序後的結果
{
 for(int i = 0; i < size; i++)
 {
  printf("%d ",array[i]);
 }
 return true;
}
typedef int (*compFun)(int a, int b);

int main()
{
 int array[10]={3,5,6,72,3,2,47,56,335,767};
 BingoSort(array,10,comp_desc);
 test_sort(array,10);
 return 0;
}
-----本人很菜,如有錯誤,望大牛指出^_^
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章