sort排序方法

在现实中我们要对一些数据排序,但是排序也不单单是我们以前所学的按照大小去排序,有可能含有很多的排序方式,比如成绩管理系统的排序,他需要先按照总分去排序,之后就是语文,数学,英语等等要求去排序,再比如说就是图书馆的摆放,包裹的摆放,他们都含有一定的规则,同样当我们需要的时候也是按照这样的规则去选择,不然就会浪费时间。

下面看一些简单的排序!

           排序的方法,在我们入门的时候其实就学了一些,比如说C语言中的选择排序,冒泡排序。

如我们现在需要把数,从小到大排序:

先来一个简单的选择排序:

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	int array[] = {1,2,3,4,5,6,7,8,9,10};     //初始
	for(int i=0;i<10;i++){
		int k=i;
		for(int j=i+1;j<10;j++){
			if(array[k]<array[j])     //寻找
			  k=j;
		}
       if(k!=i){                                 //交换
       	 int exchang = array[k];
       	 array[k] = array[i];
       	 array[i] = exchang;
	   }
	}
	for(int i=0;i<10;i++){
		cout<<array[i]<<' ';             //输出
	}
	cout<<endl;
	return 0;
}

 

 

 

但是现在我们在面临不断的选择的时候,我们发现这些排序的方法已经不再适合我们现在的需求了,所以我们需要更好的排序方式。

我们先学习一个C版的sort排序的方法。

比如:成绩的排序。

现在我们来做一个管理成绩排序的程序。

 

题目简介如下:
现在有一个班级的学生的成绩,要求进行统计。假定该班级有n(1<=n<=100)个同学,每个同学都有4门课程的成绩,现在要求统计每个学生的平均分,总分。
输出的一些要求如下:
首先按输出顺序去排序。先输出名字,排序顺序为学生的总分、平均分、语文、数学、英语,每个学生占一行,用一个空格隔开;平均分保留两位小数就可以了。  

 

 

题目我们看到的时候,我们肯定会排序,但是要让计算机去按照你的思维去排序,就有点难了。

代码如下:

 

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

//建造学生成绩存储单位
 
struct node
{
    char name[20];
    double china;
    double math;
    double english;
    double average;
    double score;
};
//开始排序 

bool cmp(node n,node m)
{
    //总分 
	if(n.score!=m.score)                     
	   return n.score>m.score;
	//平均分 
	if(n.average!=m.average)
	   return n.average>m.average;
	//语文 
	if(n.china!=m.china)
	  return n.china>m.china;
	//数学 
	if(n.math!=m.math)
	   return n.math>m.math;
	//英语 
	if(n.english!=m.english)
	  return n.english>m.english;
}

int main()
{
    struct node a[100];
    int n;
    cout<<"请输入学生个数:"<<endl; 
    scanf("%d",&n);
    cout<<"开始读入学生信息"<<endl;
    for(int i=1;i<=n;i++)
    {    
        cin>>a[i].name>>a[i].china>>a[i].math>>a[i].english;
        a[i].average=(a[i].china+a[i].english+a[i].math)/4;
        a[i].score = a[i].china+a[i].english+a[i].math;
    }
    //位置开始为a[1],所以我们就a+1开始,到a+1+n结束。 sort(初始位置,结束位置,排序规则(可无,但是限于一维从小到大排序))。 
    sort(a+1,a+1+n,cmp); 
    //输出
	for(int i=1;i<=n;i++) 
	{
		cout<<a[i].name<<' '<<a[i].score<<' '<<a[i].average<<' '<<a[i].china<<' '<<a[i].math<<' '<<a[i].english<<endl; 
	}
    return 0;
} 

学习结果:

请输入学生个数:
4
开始读入学生信息
张三 60 60 60
李四 70 70 70
王五 80 80 50
小明 90 30 50
王五 210 52.5 80 80 50
李四 210 52.5 70 70 70
张三 180 45 60 60 60
小明 170 42.5 90 30 50

--------------------------------
Process exited after 47.56 seconds with return value 0
请按任意键继续. . .

当然了,我们如果学习的是java语言,我们又怎么办呢?我们不可能去写这个,去完成啊!没有这个形式啊。

 

下面我们来看一个题目:

 

题目简介如下:
     数组排序,给定一组n个正整数,根据各位数字之和从小到大进行排序。 输入数据有多组,每组数据占一行,每行的第一个数正整数n,表示整数个数,后面接n个正整数。当n为0时,不作任何处理,输入结束。

代码如下:

 

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

class p {
	String sum1;
	int sum2;
}

class MyComparator implements Comparator {

	public int compare(Object o1, Object o2) {
		p sum1 = (p) o1;
		p sum2 = (p) o2;
		if(sum1.sum2==sum2.sum2){                               //比较各位数字之和是不是一样
			int p = (int)Integer.valueOf(sum1.sum1);
			int q = (int)Integer.valueOf(sum2.sum1);
			if(p>q) return 1;
			else return -1;
		}
		if (sum1.sum2 >= sum2.sum2)
			return 1;
		else
			return -1;
	}
}

public class MyException {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int k = sc.nextInt();
			if (k == 0)           //结束条件
				break;
			List<p> list = new ArrayList<p>();

			for (int i = 0; i < k; i++) {
				p q = new p();
				q.sum1 = new String();
				q.sum1 = sc.next();
				for (int j = 0; j < q.sum1.length(); j++) {
					q.sum2 += q.sum1.charAt(j) - '0';
				}
				list.add(q);
			}
                   //开始排序。
			Collections.sort(list, new MyComparator());
                  //排序结果输出。
			int ff = 0;
			for (int i = 0; i < list.size(); i++) {
				if (ff++!= 0)
					System.out.print(" ");
				System.out.print(list.get(i).sum1);
			}
			System.out.println();
		}
	}
}

 

其实排序,就是这样,你还可以在原来排序的基础上面,继续去构造一个新的排序方式,再创造一个函数,或者另一个类去实现,再排序,就可以了,比如就是成绩拍完排序完成,你在去根据名字再次排序。

 

我上面的是实现接口Comparator的sort排序。java中还有一个sort排序,就是Array中的sort,一样的是排序规则一样的,不一样的是排序方式位置不一样,还有就是在的包下不一样。

要知道详情的话你们可以去看一下,其中的Compare和compareTo的区别就可以了。

大神博客:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822251.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值