簡單的冒泡排序(C語言)

冒泡排序作爲所學到的第一個算法,這裏對常見的兩種方式做簡單的總結,總的來說,排序分成了固定最大值和固定最小值兩種。

  • 固定最大值:每次遍歷將所能查找到的最大值放到最末端;
  • 固定最小值:每次遍歷將所能查找到的最小值放到最首端;

1、固定最大值

該方法的思想是將最大值作爲目標,第i次遍歷時,將前\left ( n+1-i \right )個數值中最大值放到第\left ( n+1-i \right )個位置。因爲第i次遍歷時,已經將前i-1個最大的數字放到了最後,所以不用考慮這i-1個數字。假設已有的數組爲nums[4] = {9,8,7,6},用下圖來表示該方法的步驟:

                                             

上圖中下標按照C語言的數組下標來,上述步驟可以描述爲:

  • 第1(i=1)次遍歷時,可以看到9是這4個數中最大的,那麼需要把9放到第4(4-1+1)位;
  • 第2(i=2)次遍歷時,在第一次遍歷的基礎上,可以知道需要把8放到第3(4-2+1)位;
  • 第3(i=3)次遍歷時,在前兩次的基礎上,可以知道需要把7放到第2(4-3+1)位;
  • 第4次遍歷時,排序完成;

上述過程對應的代碼爲:

for (int i = 0; i < sizeof(nums) / sizeof(nums[0]);i++)//第i次遍歷
{
    for (int j = 0; j < 9 - i;j++)//限制了第i次遍歷需要查看的數字的個數,因爲前i-1個數字已經排好
    {
        if (nums[j] > nums[j + 1])//進行往後走
        {
            int temp = nums[j];
            nums[j] = nums[j + 1];
            nums[j + 1] = temp;
        }
    }
}

2、固定最小值

該方法的思想是將最小值作爲目標,第i次遍歷時,將後\left ( n+1-i \right )個數值中最小值放到第i個位置。因爲第i次遍歷時,已經將前i-1個最小數字放到了開頭,所以不用考慮這i-1個數字。假設已有的數組爲nums[4] = {9,8,7,6},用下圖來表示該方法的步驟:

                                             

上圖中下標按照C語言的數組下標來,上述步驟可以描述爲:

  • 第1(i=1)次遍歷時,可以看到6是後4(4+1-1)個數中最小的,那麼需要把6放到第1位;
  • 第2(i=2)次遍歷時,可以看到7是後3(4+1-2)個數中最小的,那麼需要把7放到第2位;
  • 第3(i=3)次遍歷時,可以看到8是後2(4+1-2)個數中最小的,那麼需要把8放到第2位;
  • 第4次遍歷時,排序完成;

上述過程對應的代碼爲:

for (int i = 0; i < sizeof(nums) / sizeof(nums[0]);i++)//第i次遍歷
{
    for (int j = i + 1; j < sizeof(nums) / sizeof(nums[0]) - i - 1;j++)
    //第i次遍歷,將從起始位置到末端這幾個數字中最小的放在第i個位置
    {
            if (a[i] > a[j])//找到更小的就換
            {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
    }
}

3、減少時間

可以看到上述的情況是冒泡排序的最差情況,即目標爲正序,所有的數字按照倒序來排序。但是若已經排列好的數組例如nums={1,2,3,3}同樣需要循環多次,浪費了時間。從上述的兩個圖中可以看到,只要沒有排列好,每次遍歷的時候肯定會出現交換數值,那麼可以用一個標記來表示是否經過了交換,沒有交換可以提前結束。實現代碼如下:

bool flag = false;
for (int i = 0; i < sizeof(nums) / sizeof(nums[0]);i++)//第i次遍歷
{
    for (int j = i + 1; j < sizeof(nums) / sizeof(nums[0]) - i - 1;j++)
    //第i次遍歷,將從起始位置到末端這幾個數字中最小的放在第i個位置
    {
            if (a[i] > a[j])//找到更小的就換
            {
                int temp = a[i];
                a[i] = a[j];
                a[j] = temp;
                flag = true;
            }
    }
    if(!flag)
        break;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章