1. 程式人生 > >藍橋杯--三部排序

藍橋杯--三部排序

標題:三部排序

    一般的排序有許多經典演算法,如快速排序、希爾排序等。

    但實際應用時,經常會或多或少有一些特殊的要求。我們沒必要套用那些經典演算法,可以根據實際情況建立更好的解法。

    比如,對一個整型陣列中的數字進行分類排序:

    使得負數都靠左端,正數都靠右端,0在中部。注意問題的特點是:負數區域和正數區域內並不要求有序。可以利用這個特點通過1次線性掃描就結束戰鬥!!

    以下的程式實現了該目標。

    其中x指向待排序的整型陣列,len是陣列的長度。

void sort3p(int* x, int len)
{
int p = 0;
int left = 0;
int right = len-1;

while(p<=right){
if(x[p]<0){
int t = x[left];
x[left] = x[p];
x[p] = t;
left++;
p++;
}
else if(x[p]>0){
int t = x[right];
x[right] = x[p];
x[p] = t;
right--;
}
else{
__________________________;  //填空位置
}
}

}

   如果給定陣列:
   25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0
   則排序後為:
   -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25

請分析程式碼邏輯,並推測劃線處的程式碼,通過網頁提交

注意:僅把缺少的程式碼作為答案,千萬不要填寫多餘的程式碼、符號或說明文字!!

程式碼:

#include<stdio.h>
void sort3p(int* x, int len)
{
    int p = 0;
    int left = 0;
    int right = len-1;

    while(p<=right)
    {
        if(x[p]<0)
        {
            int t = x[left];
            x[left] = x[p];
            x[p] = t;
            left++;
            p++;
        }
        else if(x[p]>0)
        {
            int t = x[right];
            x[right] = x[p];
            x[p] = t;
            right--;
        }
        else
        {
            p++;
            //填空位置
        }
    }

}
int main()
{
    int x[14]= {25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0};
    sort3p(x,14);
    for(int i=0; i<14; i++)
        printf("%d,",x[i]);
    return 0;
}
運算結果:



題目解析:

由題目中所給示例可將len簡單的記為14,觀察所缺部分,上面已經有了x[p]<0和x[p]>0部分,因此所填的空缺部分應為x[p]=0部分,由題意知x[p]=0時在中間不用交換位置,因此移動到下一位數字用p++即可實現。