今日学习:array数组的sort(),copyof(),tostring()

sort是一种排序算法
在这里插入图片描述
**

排序的作用

**

排序算法是为了让无序的数据组合变成有序的数据组合。
有序的数据组合最大的优势是在于当你进行数据定位和采用时,
会非常方便,因为这个数据是有序的,
从而在代码设计的时候会让你避免很多不必要的麻烦。

**

几种常见的排序算法

**

1.冒泡排序
3.插入排序
2.快速排序
4.归并排序
……还有什么拓扑排序等等太大佬的我也没看懂……


冒泡排序


原理:内循环第k次后,排在第k名的元素已被排好

if n < 2 {
    return}
for (int i=0;i<n;i++){
  for(int j=n-1;j>0;j--){
      if (A[j]>A[j-1]){
          int temp=A[j];
            A[j]=A[j-1];
            A[j-1]=temp;
      }
  }
}

**

插入排序

**

原理:对于一个排序好k个元素的数列,对下一个元素进行操作,使其插入在前面已经排序好的数列中,生成一个新的排序好k+1个元素的数列。

**

if n < 2 {
    return}
for (int i=0;i<n;i++){
  for (int j=i-1;j>=0;j--){
     if (A[j+1]<A[j]){
         int temp=A[j];
            A[j]=A[j+1];
            A[j+1]=temp; 
     }else{
         break;
     }
  }
}

减少交换次数的算法

if n < 2 {
    return
}
for (int i = 1; i < 10; i++) {
  int temp = A[i];
  for (int j = i; j >= 0; j--) {
    if (A[j - 1] > temp) {
      A[j] = A[j - 1];
    } else {
      A[j] = temp;
      break;
    }
  }
}

**

快速排序

**

原理:对于一个数列,取其中一个元素为基准,对剩余元素进行判断,比基准大的和比基准小的元素各方在基准两侧,操作完成后,将基准两侧的数列看成两个新数列,重复操作。

void qsort(int A[],int m,int n){
if (n-m<1){
    return;
}
int pivot=A[m];
int k=m;
for (int i=m+1;i<n;i++){
  if (A[i]>pivot){
    int q1=A[i];
      for (int j=i-1;j>=m;j--){
          A[j+1]=A[j];
      }
    A[m]=q1;
    k++;
  }
}
qsort(A,m,k);qsort(A,k+1,n);
}
void quickSort(int s[], int l, int r)
{
if (l < r)
{
    int i = l, j = r, x = s[l];
    while (i < j)
    {
        while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
            j--;
        if (i < j)
            s[i++] = s[j];

        while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
            i++;
        if (i < j)
            s[j--] = s[i];
    }
    s[i] = x;
    quickSort(s, l, i - 1); // 递归调用
    quickSort(s, i + 1, r);
}
}

**

归并排序

**

原理:找内存再要一个大小相等的空间,先将原数列拆为只含一个元素的单体进行排列,再进行合并。

void merge_sort_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
    return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, reg, start1, end1);
merge_sort_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
    reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
    reg[k++] = arr[start1++];
while (start2 <= end2)
    reg[k++] = arr[start2++];
for (k = start; k <= end; k++)
    arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {
int reg[len];
merge_sort_recursive(arr, reg, 0, len - 1);
}

**

copyof()是一种数组复制的操作方法

**
这个方式必须明确自行新建立一个数组对象。在JDK 6中,Arrays 类别新增了copyOf()方法,可以直接传回一个新的数组对象,而当中包括复制的内容,Array.copyOf() 用于复制指定的数组内容以达到扩容的目的,该方法对不同的基本数据类型都有对应的重载方法,Arrays的copyOf()方法传回的数组是新的数组对象,所以您改变传回数组中的元素值,也不会影响原来的数组,copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
还有一种是system.arraycopy()
src:源对象
srcPos:源数组中的起始位置
dest:目标数组对象
destPos:目标数据中的起始位置
length:要拷贝的数组元素的数量

**

toStirng方法是Object类中的方法

定义为下图,其返回值为String类型

public String toString()

在进行String与其他类型数据的连接操作时,(如下图),将调用改对象类的toSting()方法

public class He{	
public static void main(String[] args)	{	    
Person p = new Person();		
System.out.println("HelloWorld"+p);
	} 
	} 
	class Person{}

输出是:HelloWorldPerson@65b54208

官网的注释toStirng():

toString用于类 的方法Object 返回一个字符串,该字符串由对象作为实例的类的名称,符号字符“ @”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回的字符串等于:

getClass().getName()+'@'+ Integer.toHexString(hashCode())

可以根据需要在用户自定义类型中重写toString()方法

public class He{	
public static void main(String[] args)	{		
Person p = new Person();		
System.out.println("HelloWorld"+p);
	} 
	}
	class Person{	
	public String toString(){	    
	return"i'm a cool man ";	
	}}

**

本人的一次作业:

**
题目01_2
学号数组:String[] stuNo = { “2019011535”, “2019011534”, “2019011539”, “2019011538”, “2019011537” }
姓名数组:String[] stuName = { “张三”, “李四”, “王五”, “赵六”, “王九” }
成绩数组:int[] stuScore = { 53, 78, 96, 66, 85 }
学号姓名成绩一一对应
写Java程序,要求实现以下功能(提示:可以使用Arrays类中的方法sort()、copyOf()、toString()):
(1)计算成绩数组中最大值、最小值、所有值之和,并输出到控制台。
(2)分别对以上三组数据排序,向控制台输出排序前和排序后的内容。
(3)将(2)中排序好的内容复制到另外三个数组中。
(4)根据成绩排序,要求保持学号、姓名、成绩对应(选作)。

public class HomeWork {
public static void main(String[] args) {
	work1();
	System.out.println("99乘法表");
	work2();//99乘法表
}

private static void work2() {
	for(int i=9;i>=1;i--){
			for( int j=1;j<=i;j++){
				System.out.print(j+"*"+i+"="+i*j+"\t");
			}
			System.out.println();
			for( int j=0;j<=9-i;j++){
			System.out.print("\t");
			}
		}
		System.out.println();
}

private static void work1() {
	String[] stuNo=new String[]{"2019011535","2019011534","2019011539","2019011538","2019011537"};
	String[] stuName=new String[]{"张三","李四","王五","赵六","王九"};
	int[] stuScore=new int[]{53,66,78,85,96};
	int max=stuScore[0];
	int min=stuScore[0];
	int sum=0;
	for(int i=0;i<stuScore.length;i++){
		//最大值
		if(stuScore[i]>max){
			max=stuScore[i];
		}
		//最小值
		if(stuScore[i]<min){
			min=stuScore[i];
		}
		sum+=stuScore[i];//所有值之和	
	}
	System.out.println("最大值:"+max);
	System.out.println("最小值:"+min);
	System.out.println("所有值之和:"+sum);
	//默认升序
	Arrays.sort(stuNo);
	Arrays.sort(stuName);
	Arrays.sort(stuScore);
	System.out.println("学号排序前:");
		for(int i=0;i<stuNo.length;i++){
			System.out.println(stuNo[i]);
		}
	System.out.println("学号排序后:");
	for(int i=stuNo.length-1;i>=0;i--){
		System.out.println(stuNo[i]);
	}
	System.out.println("名字排序前:");
	for(int i=stuName.length-1;i>=0;i--){
		System.out.println(stuName[i]);
	}
	System.out.println("名字排序后:");
	for(int i=0;i<stuName.length;i++){
		System.out.println(stuName[i]);
	}
	System.out.println("成绩排序前:");
	for(int i=0;i<stuScore.length;i++){
		System.out.println(stuScore[i]);
	}
	System.out.println("成绩排序后:");
	for(int i=stuScore.length-1;i>=0;i--){
		System.out.println(stuScore[i]);
		
	}
	//学号排序前+排序后
	String[] stuNoCopy=Arrays.copyOf(stuNo, 5);
	System.out.println("学号排序前+排序后:");
	String[] NewStuNo=new String[stuNo.length+stuNoCopy.length];
	System.arraycopy(stuNo, 0, NewStuNo, 0, stuNo.length);
	System.arraycopy(stuNoCopy, 0, NewStuNo, stuNo.length, stuNoCopy.length);
	String nsn=Arrays.toString(NewStuNo);
	System.out.println(nsn);
	//名字排序前+排序后
	String[] stuNameCopy=Arrays.copyOf(stuName, 5);
	System.out.println("名字排序前+排序后:");
	String[] NewStuName=new String[stuName.length+stuNameCopy.length];
	System.arraycopy(stuName, 0, NewStuName, 0, stuName.length);
	System.arraycopy(stuNameCopy, 0, NewStuName, stuName.length, stuNameCopy.length);
	String nsna=Arrays.toString(NewStuName);
	System.out.println(nsna);
	//成绩排序前+排序后
	int[] stuScoreCopy=Arrays.copyOf(stuScore, 5);
	System.out.println("成绩排序前+排序后:");
	int[] NewStuScore=new int[stuScore.length+stuScoreCopy.length];
	System.arraycopy(stuScore, 0, NewStuScore, 0, stuScore.length);
	System.arraycopy(stuScoreCopy, 0, NewStuScore, stuScore.length, stuScoreCopy.length);
	String nsc=Arrays.toString(NewStuScore);
	System.out.println(nsc);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值