交换排序

    xiaoxiao2024-12-01  4

    题目描述

    冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。

    输入

    连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔。

    输出

    输出数据占一行,代表冒泡排序和快速排序进行排序分别需要的交换次数,数字间以1个空格分隔,行末不得有多余空格。

    示例输入

    8 49 38 65 97 76 13 27 49

    示例输出

    15 9

    提示

    注意:数据相等时不做交换

    来源

    #include <stdio.h> #include <stdlib.h> int a[10010],x,y,b[10010]; int sort(int b[],int s,int r) {     int i=s,j=r,key=b[s];     if(s>=r)         return -1;     while(i<j)     {         while(i<j&&b[j]>=key)j--;         if(a[i]!=a[j])         {b[i]=b[j];         y++;}         while(i<j&&b[i]<=key)i++;         if(b[i]!=b[j])         {         b[j]=b[i];         y++;}

        }     b[i]=key;     sort(b,s,i-1);     sort(b,i+1,r); } int main() {     int n,i,j,t;     while(~scanf("%d",&n))     {         x=0;         y=0;         for(i=0;i<=n-1;i++)             {scanf("%d",&a[i]);             b[i]=a[i];}         for(i=0;i<=n-2;i++)             for(j=0;j<=n-2-i;j++)         {             if(a[j]>a[j+1])             {                x++;                t=a[j];                a[j]=a[j+1];                a[j+1]=t;             }

            }         sort(b,0,n-1);        printf("%d %d\n",x,y);     }     return 0; }

     

    转载请注明原文地址: https://ju.6miu.com/read-1294141.html
    最新回复(0)