庞果英雄会 数组排序

来源:互联网 发布:js设置style display 编辑:程序博客网 时间:2024/04/30 14:52

第一次做这个网站的题目   感觉题目还不错   虽然很多题不会 

由于是第一次做我还以为只能用给出的头文件     于是自己写了个堆排上去。。。

我感觉看题目的时候就是一个贪心的过程   每次交换的时候都把最大的排好  然后再排下一个   这样就能保证交换次数最少了    至于证明嘛   呵呵  实在是不会啊

下面看代码

#include <cstdio>#include <string>#include <cstring>#define Max 105using namespace std;int s[Max],t[Max],A[Max];void merge_sort(int *A, int x, int y, int *T){    if(y - x > 1)    {        int m = x + (y - x) / 2;//划分        int p = x, q = m, i = x;        merge_sort(A, x, m, T);//递归求解        merge_sort(A, m, y, T);//递归求解        while( p < m || q < y)        {            if(q >= y || (p < m && A[p] <= A[q]))T[i++] = A[p++];//从左半边取数复制到辅助数组中            else T[i++] = A[q++];//从右半边取数复制到辅助数组中        }        for(int i = x; i < y; i++)A[i] = T[i];//从辅助空间取回排好序的数    }}int  run(const int *a,int n) //算法的实质是一个贪心的过程{    int i;    for(i = 0; i < n; i++)    A[i] = s[i] = a[i];    merge_sort(s,0,n,t);    int cnt = 0;    while(n > 0)    {        int v;        for(i = 0; i < n; i++)        if(A[i] == s[n-1]) {v = i;break;}        if(i == n-1){n--;continue;}        int temp = A[i];        A[i] = A[n-1];        A[n-1] = temp;        cnt++;        n--;    }    return cnt;}//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){    int a[3] = {1,3,2};    int re = run(a,3);    printf("%d\n",re);}//end //提示:自动阅卷结束唯一标识,请勿删除或增加。