信息学奥赛一本通(1181:整数奇偶排序)——快速排序
1181:整數奇偶排序
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 13733 ??? 通過數: 8879
【題目描述】
給定10個整數的序列,要求對其重新排序。排序要求:
1.奇數在前,偶數在后;
2.奇數按從大到小排序;
3.偶數按從小到大排序。
【輸入】
輸入一行,包含10個整數,彼此以一個空格分開,每個整數的范圍是大于等于0,小于等于30000。
【輸出】
按照要求排序后輸出一行,包含排序后的10個整數,數與數之間以一個空格分開。
【輸入樣例】
4 7 3 13 11 12 0 47 34 98【輸出樣例】
47 13 11 7 3 0 4 12 34 98【參考代碼】
? ? ? ? 快速排序是對冒泡排序的一種改進,它的基本思想是:通過一趟排序將待排記錄分割成獨立的兩個部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
【參考代碼】
#include <stdio.h>
#define N 15
int a[N],b[N];
void odd_qsort(int l,int r)
{
?? ?int i,j,mid,p;
?? ?i=l;
?? ?j=r;
?? ?mid=a[(l+r)/2];
?? ?do
?? ?{
?? ??? ?while(a[i]>mid)
?? ??? ??? ?i++;
?? ??? ?while(a[j]<mid)
?? ??? ??? ?j--;
?? ??? ?
?? ??? ?if(i<=j)
?? ??? ?{
?? ??? ??? ?p=a[i];
?? ??? ??? ?a[i]=a[j];
?? ??? ??? ?a[j]=p;
?? ??? ??? ?i++;
?? ??? ??? ?j--;
?? ??? ?}
?? ?}while(i<=j);
?? ?if(l<j)
?? ??? ?odd_qsort(l,j);
?? ?if(i<r)
?? ??? ?odd_qsort(i,r);
}
void even_qsort(int l,int r)
{
?? ?int i,j,mid,p;
?? ?i=l;
?? ?j=r;
?? ?mid=b[(l+r)/2];
?? ?do
?? ?{
?? ??? ?while(b[i]<mid)
?? ??? ??? ?i++;
?? ??? ?while(b[j]>mid)
?? ??? ??? ?j--;
?? ??? ?
?? ??? ?if(i<=j)
?? ??? ?{
?? ??? ??? ?p=b[i];
?? ??? ??? ?b[i]=b[j];
?? ??? ??? ?b[j]=p;
?? ??? ??? ?i++;
?? ??? ??? ?j--;
?? ??? ?}
?? ?}while(i<=j);
?? ?if(l<j)
?? ??? ?even_qsort(l,j);
?? ?if(i<r)
?? ??? ?even_qsort(i,r);
}
int main()
{
?? ?int i,j=0,k=0,x;
?? ?for(i=0;i<10;i++)
?? ?{
?? ??? ?scanf("%d",&x);
?? ??? ?if(x%2!=0)
?? ??? ?{
?? ??? ??? ?a[j]=x;
?? ??? ??? ?j++;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?b[k]=x;
?? ??? ??? ?k++;
?? ??? ?}
?? ?}
?? ?odd_qsort(0,j-1);
?? ?even_qsort(0,k-1);
?? ?
?? ?for(i=0;i<j;i++)
?? ??? ?printf("%d ",a[i]);
?? ?for(i=0;i<k;i++)
?? ??? ?printf("%d ",b[i]);
?? ?return 0;
}
http://ybt.ssoier.cn:8088/problem_show.php?pid=1181
?
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1181:整数奇偶排序)——快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1057:简单计算器)
- 下一篇: 信息学奥赛一本通 2006:【20CSP