#36754: 不給你答案


benjaminhsu124@gmail.com (漂亮的九尾)

學校 : 不指定學校
編號 : 237130
來源 : [59.127.203.120]
最後登入時間 :
2023-07-09 15:40:48
a233. 排序法~~~ 挑戰極限 -- 24TH 成功電研社內考 | From: [59.127.203.120] | 發表日期 : 2023-08-06 15:44

 
 
#include<stdio.h>
#include<math.h>
void print(int*,int);
void divide(int*,int,int);
void conquer(int*,int,int,int);
int main(){
int size;
scanf("%d",&size);//讀入串列大小
int arr[size];
for(int i=0;i<size;i++){//將資料放入串列
scanf("%d",&arr[i]);
}
int l=0,r=size-1;
divide(arr,l,r);
print(arr,size);//印出來
}

void print(int*arr,int size){
for(int i=0;i<size;i++){
printf("%d",arr[i]);
printf(" ");
}
printf("\n");
}
void divide(int*arr,int l,int r){
int mid;
if(l<r){//代表data還沒切割到最後一個
mid=(l+r)/2;
divide(arr,l,mid);
divide(arr,mid+1,r);
conquer(arr,l,mid,r);
}
}


void conquer(int*arr,int l,int mid,int r){
int t1=(mid-l+1);
int t2=(r-mid);
int temp1[t1];
int temp2[t2];
//宣告出兩個陣列將資料存入
for(int i=0;i<t1;i++){
temp1[i]=arr[l+i];
}
for(int j=0;j<t2;j++){
temp2[j]=arr[mid+j+1];
}
int i=0;//代表temp1陣列起始
int j=0;//代表temp2陣列起始
int initial=l;//代表原始陣列的index
while(i<t1&&j<t2){//代表各arr有大於一個data
if(temp1[i]<=temp2[j]){
arr[initial]=temp1[i];
i++;
}
else if(temp1[i]>temp2[j]){
arr[initial]=temp2[j];
j++;
}
initial++;//無論怎樣原始陣列都會讀入一個較小的值且往前
}
while(i<t1){//當陣列一邊為空
arr[initial]=temp1[i];
i++;
initial++;
}
while(j<t2){
arr[initial]=temp2[j];
j++;
initial++;
}
}

 

 
ZeroJudge Forum