1. 程式人生 > >C語言之排序

C語言之排序

氣泡排序

兩兩比較,小的先冒泡。

void bubbling(const char* str)
{
  int len=strlen(str);
  int t;
  int i;
  for(t=1;t<len;t++)   //t代表要排序幾位,注意t==1,
  {
   for(i=len-1;i>=t;i--) //注意 i==len-1,i>=t
   {
     if(str[i]>str[i+1])
     { 
       swap(str[i],str[i+1]);
     }
   } 
  }
}

 對冒泡演算法做點小優化:有時候陣列內元素基本都是排序完成的,只需改動一兩個資料,此時增加標誌位有利於提高效率。避免在已經有序的情況下,繼續無意義的迴圈。

void bubbling(const char* str)
{
  int len=strlen(str);
  int t;
  int i;
  int flag;
  for(t=1;t<len&&(!flag);t++)   //t代表要排序幾位,注意t==1,
  {
   flag=0;
   for(i=len-1;i>=t;i--) //注意 i==len-1,i>=t
   {
     if(str[i]>str[i+1])
     { 
       swap(str[i],str[i+1]);
       flag=1;//資料更換完成
     }
   } 
  }
}

快速排序

快速排序就是 通過一次排序將待排的資料分成兩部分,再分別對這兩部分進行分成兩部分的操作,直到剩下一個資料。

這篇文章寫的很好!

int quick_sort(char* str,int left,int right)
{ 
  int left_temp;
  int right_temp;
  int temp;
  int cup;

  left_temp=left;
  right_temp=right;
  temp=str[left];  //以最左邊的數為基準數此時需要從右邊開始找起。

  while(left_tmep!=right_temp)
  {
    while(str[right_temp]>=temp&&(right_temp>left_temp))
    right_temp--;
    while(str[left_temp]<=temp&&(right_temp>left_temp))
    left_temp--;
    if(left_temp<right_temp)
    {
      cup=str[right_temp];
      str[right_temp]=str[left_temp];
      str[left_temp]=cup;
    }
  }
  //將基準數歸位
  str[left]=str[left_temp];
  str[left_temp]=temp;
  
  quick_sort(str,left,left_temp-1);
  quick_sort(str,left_temp+1,right);
 
  
}