1. 程式人生 > 其它 >藍橋杯基礎練習-數列排序C 和 時間轉換

藍橋杯基礎練習-數列排序C 和 時間轉換

技術標籤:藍橋杯

一、排序

1、冒泡:

#include<stdio.h>
int main()
{
	unsigned int n,i,j,t;
	scanf("%d",&n);
	int P[n];
	for(i=0;i<=n-1;i++)
	{
		scanf("%d",&P[i]);
	}
	for(j=n;j>=1;j--)
	{
		for(i=0;i<j-1;i++)
		if(P[i]>P[i+1])
		{
			t=P[i+1];
			P[i+1]=P[i];
			P[i]=t;
		}
	}
		for(i=0;i<=n-1;i++)
		{
		printf("%d",P[i]);
		printf(" ");
		}
	return 0;
}

2、快排

#include <stdio.h>
int a[10000],n;//定義全域性變數,這兩個變數需要在子函式中使用

void quicksort(int left,int right) {
	int i,j,t,temp;
	if(left>right)        return;
	temp=a[left]; //temp中存的就是基準數
	i=left;
	j=right;
	while(i!=j)     {         //順序很重要,要先從右往左找
		while(a[j]>=temp && i<j)             j--;         //再從左往右找
		while(a[i]<=temp && i<j)
			i++;
		if(i<j) { //當哨兵i和哨兵j沒有相遇時
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
	a[left]=a[i];
	a[i]=temp;
	quicksort(left,i-1);//繼續處理左邊的,這裡是一個遞迴的過程
	quicksort(i+1,right);//繼續處理右邊的,這裡是一個遞迴的過程
}

int main() {
	int i,j,t;     //讀入資料
	scanf("%d",&n);
	for(i=1; i<=n; i++)
		scanf("%d",&a[i]);

	quicksort(1,n); //快速排序呼叫           //輸出排序後的結果
	for(i=1; i<=n; i++)
		printf("%d ",a[i]);

	return 0;
}

#我的快排,居然報超時!!!

#include <stdio.h>

void quickSort(int arr[], int low, int high)
{
    int first = low;    //第一個元素的下標 
    int last  = high;   //最後一個元素的下標 
    int key = arr[first];
    if(low >= high)
        return;
    while(first < last)  //實現多次交換,使key去到它應在的位置 
    {
        while(first < last && arr[last] > key)  //實現一次交換 
        {
            last--;
        }
        arr[first] = arr[last];

        while(first < last && arr[first] < key)
        {
            first++;
        }
        arr[last] = arr[first];
    }
    
    arr[first] = key;

    quickSort(arr, low, first-1);  //此first不是first,是key應在的位置 
    quickSort(arr, first+1, high);
}

int main()
{
    int n,i;
    scanf("%d",&n);
    
    int a[n];
    for(i = 0; i < n; i++)
    	scanf("%d",&a[i]);

    quickSort(a, 0, n-1);

    for(i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");

    return 0;
}

原因: while(first < last && arr[last] > key) //實現一次交換 和 while(first < last && arr[first] < key) 未考慮等於的情況,當陣列中出現兩個相同的數是,while死迴圈,自然就超時了。

二、時間轉換:

1、

#include<stdio.h>
int main()
{
	int a,b,c,d;
	scanf("%d",&a);
	b=(int)(a/3600);
	c=(int)(a%3600)/60;
	d=(int)(a%3600)%60;
	printf("%d:%d:%d",b,c,d);
	return 0;
}

2、我的

int main(){
	int t;
	
	scanf("%d",&t);
	
	int h = t/3600;
	int m = (t-h*3600)/60;
	int s = t-h*3600-m*60;
	
	char A[11];
	char a[1] = {'<'};
	char b[2] = {'>',':'};	
//	char b[2] = {'<',h,'>',':','<',m,'>',':','<',s,'>'};
	printf("%d %d %d\n",h,s,m);
	sprintf(A, "%s%d%s%s%d%s%s%d%s",a, h, b,a, m, b,a, s, b);
	
	printf("%s",a);
	return 0;
}

在這裡插入圖片描述
輸出居然是這樣的,有問題!!!