谁能帮我用c解决一下这道题(测试用例有时间限制)

img

img


#include <stdio.h>
#include <stdlib.h>
int bubble(int *a, int n)
{
    int i = 0,
        j = 0,
        buf;
    int count = 0;
    for (i = 0; i < n - 1; ++i) //比较n-1轮
    {
        for (j = 0; j < n - 1 - i; ++j) //每轮比较n-1-i次,
        {
            if (a[j] > a[j + 1])
            {
                buf = a[j];
                a[j] = a[j + 1];
                a[j + 1] = buf;
                // arrayPrint(a,n);
                count++;
            }
        }
    }
    return count;
}
int main(int argc, char const *argv[])
{
    int length;
    scanf("%d", &length);
    int a[length];
    for (int i = 0; i < length; i++)
    {
        scanf("%d", &a[i]);
    }
    int count = bubble(a, length);
    printf("%d", count);
}

借用了下面那个人的。。。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int length;
    scanf("%d", &length);
    int a[length];
    for (int i = 0; i < length; i++)
    {
        scanf("%d", &a[i]);
    }
    int count = bubble(a, length);
    printf("%d", count);
}
int bubble(int *a, int n)
{
    int i = 0,
        j = 0,
        buf;
    int count = 0;
    for (i = 0; i < n - 1; ++i) //比较n-1轮
    {
        for (j = 0; j < n - 1 - i; ++j) //每轮比较n-1-i次,
        {
            if (a[j] > a[j + 1])
            {
                buf = a[j];
                a[j] = a[j + 1];
                a[j + 1] = buf;
                // arrayPrint(a,n);
                count++;
            }
        }
    }
    return count;
}
// void arrayPrint(int * a ,int n){
//     for (int i = 0; i < n; i++)
//     {
//         printf("%d\t",a[i]);
//     }
//     printf("\n");
    

// }

有帮助望采纳

这不就是一个冒泡排序码?

已优化,有帮助望采纳

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
    int length;
    scanf("%d", &length);
    int a[length];
    for (int i = 0; i < length; i++)
    {
        scanf("%d", &a[i]);
    }
    int count = bubble(a, length);
    printf("%d", count);
}
int bubble(int *a, int n)
{
    int i = 0,
        j = 0,
        temp;
    int count = 0;
    int isOrdered = 0;
    int lastExchangeIndex;
    int unorderedBorder = n - 1;

    for (i = 0; i < n - 1; ++i) //比较n-1轮
    {
        isOrdered = 1;
        for (j = 0; j < unorderedBorder; ++j) //每轮比较n-1-i次,
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                //如果出现有元素交换,则表明此躺没有完成排序
                isOrdered = 0;
                count++;
                // arrayPrint(a, n);
                //记录下最后一次交换元素的位置
                lastExchangeIndex = j;
            }
        }
        unorderedBorder = lastExchangeIndex;
        if (isOrdered)
        {
            break;
        }
    }
    return count;
}
// void arrayPrint(int *a, int n)
// {
//     for (int i = 0; i < n; i++)
//     {
//         printf("%d\t", a[i]);
//     }
//     printf("\n");
// }

再优化

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
    int length;
    scanf("%d", &length);
    int a[length];
    for (int i = 0; i < length; i++)
    {
        scanf("%d", &a[i]);
    }
    int count = bubble(a, length);
    printf("%d", count);
}
int bubble(int *a, int n)
{
    int i = 0,
        j = 0,
        temp;
    int count = 0;
    int isOrdered = 0;
    int lastExchangeIndex;
    int unorderedBorder = n - 1;

    for (i = 0; i < n - 1; ++i) //比较n-1轮
    {
        isOrdered = 1;
        for (j = 0; j < unorderedBorder; ++j) //每轮比较n-1-i次,
        {
            if (a[j] > a[j + 1])
            {
                // temp = a[j];
                // a[j] = a[j + 1];
                // a[j + 1] = temp;
                a[j + 1] ^= a[j];
                a[j] ^= a[j + 1];
                a[j + 1] ^= a[j];
                //如果出现有元素交换,则表明此躺没有完成排序
                isOrdered = 0;
                count++;
                // arrayPrint(a, n);
                //记录下最后一次交换元素的位置
                lastExchangeIndex = j;
            }
            // printf("%d\n", lastExchangeIndex);
            // arrayPrint(a, n);
        }
        unorderedBorder = lastExchangeIndex;
        if (isOrdered)
        {
            break;
        }
    }
    return count;
}
// void arrayPrint(int *a, int n)
// {
//     for (int i = 0; i < n; i++)
//     {
//         printf("%d\t", a[i]);
//     }
//     printf("\n");
// }
void Qsort(dataArray *array,int low,int high){
    int pivot;
    if(low<high){
        pivot = Partition(array, low, high);//将dataArray[low...high]一分为二,并返回枢轴下标
        
        Qsort(array, low, pivot-1);//递归对低子表进行排序
        Qsort(array, pivot+1, high);//递归对高子表进行排序
   
    }
}


/*
 **交换顺序表dataArray中子表的记录,使枢轴记录到位,并返回其所在位置
 **目标使枢轴两边的元素均不大于(小于)它
 */
int Partition(dataArray *array,int low,int high){
    int pivotKey,temp;
    pivotKey = array->dataArray[low];//用子表的第一个记录作为枢轴记录
    while(low<high){//从两端交替向中间扫描
     
        while(low<high && array->dataArray[high]>=array->dataArray[pivotKey]){
            high--;
        }
        temp = array->dataArray[high];//将比枢轴小的记录交换到低端
        array->dataArray[high] = array->dataArray[low];
        array->dataArray[low] = temp;
        
        while(low<high && array->dataArray[low]<=array->dataArray[pivotKey]){
            low++;
        }
        temp = array->dataArray[high];//将比枢轴大的记录交换到高端
        array->dataArray[high] = array->dataArray[low];
        array->dataArray[low] = temp;
        
    }
    
    return low;//返回枢轴所在的位置
}

给你点核心的代码,平均时间复杂度是O(nlog2n),空间复杂度为O(log2n