求助:分组并从大到小排序,且每组最大值赋值从1 开

作者&投稿:愚岚 (若有异议请与网页底部的电邮联系)
~
/*
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并
成一个有序表,称为二路归并。
归并过程为:比较a[i]和b[j]的大小,若a[i]>=[j](从大到小,如果要
从小到大,则<=),则将第一个有序表中的元素a[i]复制到r[k]中,并令
i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令
j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另
一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的
算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左
边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并
操作合并成有序的区间[s,t]。
*/
#include<stdio.h>
int b[10];
//将有二个有序数列a[first...mid]和a[mid...last]合并。归并排序.  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] >= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
      
    while (i <= m)  
        temp[k++] = a[i++];  
      
    while (j <= n)  
        temp[k++] = a[j++];  
      
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左边有序  
        mergesort(a, mid + 1, last, temp); //右边有序  
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
    }  
}    
 
int main(){
    int arr[]={55,2,6,89,100,21,4,78,5,18}; //举例数组,赋值请自行更改,或者用随机数生成   
    int n=10;
    int    i=0;
    mergesort(arr,0,n-1,b);
    while(i<n)
    {
        printf("%5d",arr[i]);    
        i++;
            }    
    printf("
");
}

归并操作(从小到大排序)

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。

如 设有数列{6,202,100,301,38,8,1}

初始状态:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;

第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;

第三次归并后:{1,6,8,38,100,202,301},比较次数:5;

总的比较次数为:3+4+5=12,;

逆序数为14;

算法描述(从小到大排序)

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾




sqlserver用group by分组了,但是怎么才能给每一组数据按照从小到大编...
可以使用内置函数 dense_rank() over () 的方式来进行分组排序编号,就是说按照你的排序方式来自动生成序列编号

用C语言编程,将50个实验数据从小到大排列,排完分为10组。请教大神赐教...
int a=0; \/\/正在处理的数下标,分组时的循环1 int b; \/\/正在循环的数下标,分组时的循环2 int num[50]; \/\/输入的数 int out[10][5]; \/\/分好的数,out[0]为一组 \/\/排序部分:while(a<=49){ for(b=0;b>=a&&b<=49;b++){ if(num[b]>=num[b+1]){num[b]^...

把正整数从小到大一次分组:第一组(1).第二组(2,3),第三组(4,5,6...
您好,选B 第1组的首项:1 第2组的首项:2=1+1 第3组的首项:4=1+1+2 第4组的首项:7=1+1+2+3 ...第n组的首项an=1+1+2+3+4+...+n-1=1+(1+n-1)*(n-1)\/2 =1+n(n-1)\/2 第n组有n个数。公差为1 所以 Sn=[2an+(n-1)]*n\/2=1\/2*(n^3+n)所以 S21...

把所有正奇数从小到大排列,并按如下规律分组:(1),(3,5,7),(9,11,13...
如果对你有帮助 请给好评。答题不容易 需要你的支持 如果有不懂的地方 请在新页面中提问

【题文】把所有正偶数从小到大排列,并按如 下规律分组:(2),(4,6...
(14,16,18,20)

把自然数从小到大按1个,2个,3个,。。。的顺序分组排列:(1),(2,3...
把自然数从小到大按1个,2个,3个,。。。的顺序分组排列:(1),(2,3),(4,5,6),(7,8,9,10)...(1)求第十组最初的一个数。(2)求第十组中所有数的和。(3)100是第几组中的第几个数。分析:通过观察,求这个顺序数列的通项公式。就是里面的数和组数的关系,第1组(1)第2组...

c语言分段排序 整型数组,偶数在前,奇数在后,从小到大
include <stdio.h>#include <conio.h>#define LEN 100 \/*数组长度上限*\/#define elemType int \/*元素类型*\/\/*输入数组*\/void inputArr (elemType arr[], int len) {int i;for (i=0; i<len; i++)scanf ("%d",&arr[i]);putchar ('\\n');}\/*升序冒泡排序*\/\/*参数说明:*\/\/*...

从1开始由小到大按一个数、两个数、三个数的顺序重复不断地分组,那么第...
以每3次为一周期,第100组的第一个数是6×(100-1)+1=595,其余的数为:596、597;598、599、600,和为:595+596+597+598+599+600=3585.答:第一百组中数的和3585.

数值型数据的分组方法有哪些?简述组距分组的步骤?
这都不便于观察数据分布的特征和规律。组数的确定应以能够显示数据的分布特征和规律为目的。2、确定各组的组距。组距是一个组的上限与下限的差,可根据全部数据的最大值和最小值(即极差)及所分的组数来确定,即组距=(最大值-最小值)\/组数。3、根据分组整理成频数分布表。

...1个奇数进行分组,即第一组、第二组、第三组…的数分别构
依题意,前n组中共有奇数:1+3+5+…+(2n-1)=n2个,而2007=2×1004-1,它是第1004正奇数.∵312=961<1004<1024=322,∴2007应在第31+1=32组中. 故答案为:32.

崇文区19182953765: 求助:分组并从大到小排序,且每组最大值赋值从1 开 -
撒萱安达: /* 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序....

崇文区19182953765: c语言怎么输出数组第一个数,和由大到小排序,并输出最大的数 -
撒萱安达: 别光顾着在学校玩,要搞点学习啊 最好理解的方法:冒泡法排序 从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置.第一遍的比较后,最大的数已 放在最后,第二遍只需考虑(N-1-i)个数...

崇文区19182953765: oracle sql查询完成分组并只返回每组的最小最大值一张表table 只有一个字段 id,实现以下功能,使用一条sql进行查询,将表中数据按按id排序,并每100条... -
撒萱安达:[答案] 我的测试表里有7条数据.每3条数据分作一组求最小和最大id.WITH tmp ("id") AS (SELECT 1 FROM DUAL UNION ALLSELECT 2 FROM DUAL UNIO...

崇文区19182953765: oracle sql查询完成分组并只返回每组的最小最大值 -
撒萱安达: 我的测试表里有7条数据.每3条数据分作一组求最小和最大id.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16WITHtmp ("id") AS (SELECT1 FROMDUAL UNIONALL SELECT2 FROMDUAL UNIONALL SELECT3 FROMDUAL UNIONALL SELECT4 ...

崇文区19182953765: 求助!!二维数组排序算法 -
撒萱安达: 1.由于每一行元素从大到小,即 a[i][j] > a[i][j+1] . 可以简单地理解成左边的一列整体小于右边的一列,所以可以把M*N个数分成从大到小N组;2.对M*N个数进行一次Qsort,从大到小分成N组,分别对应第一到第N列;奇数列从小到大填,偶数列...

崇文区19182953765: Mongo group分组后,怎么对分组后的结果进行从大到小排序,并取前5个 -
撒萱安达: 可以使用 {$group:{_id:"$_id","defaults":{$push:"$name"}}},{$sort:{name:1}}{$limit:5}

崇文区19182953765: C++求助 编辑一个程序,使得可以不断的将新输入的数字元素排列在数组中,且数组依次由大到小排列顺序. -
撒萱安达: #include <iostream>using namespace std;int count=5;void add(int* s,int n){ int pos=0; for(int i=count-1;i>=0;i--) { if(n<s[i]) { continue; } else { for(int j=count;j>i;j--) { s[j+1]=s[j]; } s[i+1]=n; count++; return; } } for(int j=count;j>0;j--) { s[j]=s[j-1]; } s[0]=n; count...

崇文区19182953765: 一组数据按从大到小的顺序排列 -
撒萱安达: 一组数据按从小到大(或从大到小)的顺序排列后,如果这组数据的个数是奇数,则这组数据的中位数是位于正中间的数; 如果这组数据的个数是偶数,则这组数据的中位数是位于最中间的两个数的平均数

崇文区19182953765: 在EXCEL中怎麽将数据分组排列成下图那样? -
撒萱安达: 抛砖引玉: 一:添加辅助列,如在F2输入函数: =LARGE(待分类排序数据所在的区域引用,ROW(A1)), 注:引用可以是$A:$E,这样将数据排序成为1列,按由大到小,降序. Large换作Small,则是由小到大,升序. 二:index函数. ...

崇文区19182953765: 求助Java高手啊~~~~(> - <)~~~~ 作业 数组 排序 最大值 输出 构造 元素 java -
撒萱安达: import java.util.Arrays; public class Test2 { public static void main(String[] args) { MyArray array=new MyArray(3, 3, 2, 1, 6); System.out.println("最大值是:"+array.maxValue()); array.sort(); array.printArray(); } } class MyArray { private int[] ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网