数组其他部分及java常见排序
数据结构的基本概述:
数据结构是讲什么,其实大概就分为两点:
1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
2.数据的存储结构:
一对一的:线性表:顺序表(比如:数组)、链表、栈(先进后出)、队列(先进先出)
一对多的:树形结构:二叉树等
多对多的:图形结构
数组中涉及到常见的算法:
1.数组元素的赋值(杨辉三角、回行数等)
2.求数值型数组中元素的最大值、最小值、平均数、总和等。
3.数组的复制、反转、查找(线性查找、二分法查找)
4.数组元素的排序算法。
关于多维数组的经典题目之杨辉三角:
public static void main(String[] args) {
    int [][] arr = new int[10][];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = new int[i+1];
        for (int j = 0; j < arr[i].length; j++) {
            if (j==0||j==arr[i].length-1){
                arr[i][0] = arr[i][j] = 1;
            }else{
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
            }
            System.out.print(arr[i][j]+"\t");
        }
        System.out.println();
    }
}
插播一下关于生成一个随机数:
Math.random() // [0.0,1) Math.random() * 90 // [0.0,90.0) int(Math.random() * 90) // [0.0,89] int(Math.random() * 90 + 10) // [10,99]
所以公式:获取【a,b】范围的随机数:(int)(Math.random()*(b-a+1))+a
关于数组的复制值得一说的是:
arry1 = arry2;//这个不是数值上的复制,而是把arry2的地址给了arry1,修改arry1的值,
//arry2也会改变。
那么怎么只是单纯的复制数值呢?可以这样通过遍历赋值:
int [] arry1 = new int[arry2.length];
for (int i = 0; i<arry1.length;i++){
arry1[i] = arry2[i];
}
数组的反转实现:
方法一:
for(int i = 0;i < arr.length / 2;i++ ){//这里除二,不管是奇数个或者偶数个数都一样,不
                                                     //用加=,体会体会。
        String temp = arr[i];
        arr[i] = arr[arr.length - i - 1];
        arr[arr.length - i - 1] = temp;
}        
方法二:
for(int i = 0, j = arr.length - 1;i<j;i++,j--){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
}
关于二分法需要注意:所要查找的数组必须是有序的。
十大内部排序:
选择排序:
>直接选择排序、堆排序
交换排序:
>冒泡排序、快速排序
插入排序:
直接插入排序、折半插入排序、shell排序
归并排序
桶式排序
基数排序
冒泡排序代码:
for (int i = 0; i <arr.length-1 ; i++) {
            for (int j = 0;j<arr.length-i-1;j++) {
                if (arr[j] > arr[j+1]) {
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
快速排序:
快速排序通常明显比同为O(nlogn)的其他算法更快,而且采用了分治法的思想,很重要。
排序思想:
1.从数列中挑选出一个元素,称为“基准”。
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以放任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作。
3.递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
4.递归的最底部情,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代中,它至少会把一个元素摆到它最后的位置去。
这么多排序算法的性能怎么样呢?如下图:

适用场景比较:
1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
3.从稳定性看:直接插入排序、冒泡排序和归并排序是稳定的;而直接选择排序、快速排序、Shell排序和堆排序是不稳定排序。
4.从待排序的记录数n的大小看,n较小时,宜采用简单排序,当n较大时宜采用改进排序。
java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法。
1.Arrays.equals(arr1,arr2);判断两个数组是否相等:
查看源码可以得知,其实这个判断呢它是先通过arr1==arr2判断地址是否相同,然后在判断长度是否相同,最后判断元素是否相同,当然地址相同直接跳出,长度不同直接跳出,元素遍历时有所不同,直接跳出。
2.Arrays.tostring(arr1);
查看源码其实就是通过stringbuilder一个一个拼接成字符串的。
3.Arrays.fill(arr1,n);
查看源码其实就是遍历赋值,把arr1的每个元素变成n。
4.Arrays.sort(arr1);
查看源码底层就是快排。
5.Array.binarySearch(arr1,n);
返回负数为没找到n,正数表示找到位置索引。
数组中的常见异常:
1.数组角标越界异常:ArrayIndexOutOfBoundsExcetion
2.空指针异常:NullPointerException
数组其他部分及java常见排序的更多相关文章
- Java常见排序算法之Shell排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - java常见排序方法
		
1.java常用排序方法 1) 选择排序 原理:a. 将数组中的每个元素,与第一个元素比较 如果这个元素小于第一个元素, 就将这个 两个元素交换. ...
 - Java常见排序算法之归并排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之折半插入排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之直接插入排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之快速排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之冒泡排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之堆排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 - Java常见排序算法之直接选择排序
		
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
 
随机推荐
- oo原则
			
基本原则: 封装变化Encapsulate what varies. 面向接口编程而非实现 Code to an interface rather than to an implementation. ...
 - 基于jquery的ajax方法封装
			
在实际的项目里,ajax的应用频率很高,所以尽管jquery或者其他的一些类似的js库做了非常不错的封装,仍然有进一步封装简化的空间和必要 举一个例子,很久很久以前,我的ajax是这么写的: $.aj ...
 - 详解Python垃圾回收机制
			
http://www.qytang.com/cn/list/28/417.htmhttp://www.qytang.com/cn/list/28/416.htmhttp://ww 引用计数 Pytho ...
 - 汉诺塔(hanoi)
			
汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) ...
 - CodeForces 339B Xenia and Ringroad(水题模拟)
			
题意:给定 n 个地方,然后再给 m 个任务,每个任务必须在规定的地方完成,并且必须按顺序完成,问你最少时间. 析:没什么可说的,就是模拟,记录当前的位置,然后去找和下一个位置相差多长时间,然后更新当 ...
 - 2015-08-13T17:39:15
			
ACTION里 Date upateTime; 有setter getter 页面字符串 是'2015-08-13T17:39:15' 该字符串可以直接映射成Date .
 - 编写高质量代码改善C#程序的157个建议——建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内
			
建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程.应该尽量在循环当中对异常发生的一些条 ...
 - C#  过滤SQL 字符串中的  参数
			
/// <summary> /// 参数过滤 /// </summary> /// <param name="parameters"></ ...
 - NIOS II SOPC系统自定义IP常见知识点总结
			
封装IP1.将写好的Verilog代码添加在Quartus工程中,IP目录下,(如果没有,自己建一个)2.打开Qsys工具,选择New Component3.name和Display name输入合理 ...
 - Digester学习笔记(二)转载
			
为便于理解,将笔记的内容结构作了一些调整. 对象栈 对digester技术最普通的应用,是用来动态创建一个由Java对象构成的树结构,各对象的属性以及对象间的关系,基于XML文档的内容来设置(XML文 ...