排序之交換排序

知世同學哇發表於2020-12-25

氣泡排序

void BubbleSort(int arr[],int n)
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=0;j<n-1-i;j++)//每經過一次排序,最大的數就已經確定,因此需要排序的個數就要減少
        {
            if(arr[j]>arr[j+1])
            {
                swap(arr[j],arr[j+1]);
            }
        }
    }
}
總結
  • 時間複雜度仍為n^2

快速排序

void QuickSort(int arr[],int low,int high)
{
    if(low<high)
    {
        int pk=Partition(arr,low,high);//快速排序實際上是找到一個元素將他作為中間元素進行排序,
        //在他左邊的一定比他小,而在他右邊的一定比他大,因此需要遞迴繼續修改其左右兩邊的值
        QuickSort(arr,low,pk-1);
        QuickSort(arr,pk+1,high);
    }
}
void Partiton(int arr[],int low,int high)
{
    int pk=arr[low];//pk為哨兵位,用來記錄選定的資料
    while(low<high)//一般終止時low==high
    {
        while(low<high&&arr[high]>=pk)//在達到終止條件前,移動了high或者low後,就不用再進入迴圈了,因此在這也要判斷
            high--;
        arr[low]=arr[high];//如果原本在high處的數小於哨兵位,就要將其值賦給low,因為哨兵位的值空出來了,
        //因此在賦值時不用擔心將前面的值覆蓋了
        while(low<high&&arr[low]<pk)
            low++;
        arr[high]=arr[low];
    }
    arr[low]=pk;//終止時low==high,再將哨兵位pk的值付給他
    return low;
}
總結
  • 如果pk中的數是比較居中的數,則效率較高,如果是最小的數或最大的數,則會退化為氣泡排序

相關文章