件名の説明:
タイトル:3つのソート
このようようにクイックソート、丘やなどの古典的なアルゴリズムの多くの一般的な並べ替えがあります。
しかし、実際のアプリケーションでは、多くの場合、多かれ少なかれ、いくつかの特別な要件があります。私たちは、実際の状況に応じて、より良いソリューションを構築することができ、それらの古典的なアルゴリズムを適用する必要はありません。
例えば、ソート数の整数の配列のために:
負の左に依存しているように、右側が正の数、途中で0です。注文が負の領域と正のゾーンに必要とされない。問題はによって特徴付けられることに留意されたいです。この機能は、戦いを終わらせるために、単一のリニア走査で使用することができます!
この目標を達成するために、次の手順。
xがソートされる整数配列を指しており、LENは、配列の長さです。
ボイドsort3p(INT * X、INT LEN)
{
int型、P = 0。
; 0 =左のint
lenの-1 =右int型。
一方、(P <=右){
IF(X [P] <0){
int型、T = X [左]。
X [左] = xと[P]。
X [P] = T。
++左;
P ++;
}
そうでなければ(X [P]> 0){もし
INT T = X [右]。
X [右] = xと[P]。
X [P] = T。
右 - ;
}
{他
__________________________。//填空位置
}
}
}
所与の配列の場合:
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<iostream>
using namespace std;
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 a[10]={0,-1,0,0,-2,5,3,1,0,7};
sort3p(a,10);
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}