(八)数组以及排序和查找

JavaSE(八)

--数组以及排序和查找

一、数组的定义

三种定义方法:

int b[]=new int[5];

Int []b=new int[5];

int[] a=new int[5]; (建议使用这种定义方法) //必须规定数组长度,因为在编译的时候就要分配内存。

我们也可以在定义的时候就初始化数组

Int[] a={1,2,3,3,5};

这默认了数组a的长度是5.

分配内存详情如下:

开辟一块内存,有5个小块,a指向数组的首地址。

int[][] b=new int[5][];  //至少确定第一维的个数(即数组行数)才不会提示有错。第二维的个数可以暂时不固定。

int[][][] b=new int[5][][]; 同理三维数组长度也至少确定第一维的个数才不会提示有错。也可以确定一二维的个数,int[][][] b=new int[5][4][]; 但是无法单跨维确定,例如int[][][] b=new int[5][][5];

二、数组的遍历。

①只有确定了所有维数去遍历一个数组才不会报错。

②数组下标从0开始,到n-1结束(n为该维长度)。比如int[] s=new int[3]。这个数组长度为3,s[0],s[1],s[2]就是这三个值,访问s[3]是会报错的,报数组越界异常java.lang.ArrayIndexOutOfBoundsException。

为什么是0开始呢?跟外国人建房子习惯有关,因为外国人建房子都会建地下室,地下室不就是0层了(地下一层也叫地上0层,因为在地上一层的下一层)。

③没有初始化的时候,int数组所有元素值为0,float、double所有元素值为0.0,String所有元素值为null。Char所有元素都是一个空格(而不是什么都没有)。

④ char[] c=new char[a]; //a为已知常数

遍历方式一(for循环,用int变量控制):

for(int i=0;i<a;i++){

System.out.println(c[i]);

}

遍历方式二(for循环):

for(char p:c){

System.out.println(p);

}

char[][] c=new char[a][b]; //a,b为已知常数

遍历方式一(for循环,用int变量控制):

for(int i=0;i<a;i++){

for(int j=0;j<b;j++){

System.out.println(c[i][j]);

}

}

遍历方式二(for循环):

for(char i[]: c){

for(char j:i){

System.out.println(j);

}

}

三、排序

1.排序法种类:

内部排序: 指将需要处理的所有数据都加载到内部存储器中进行排序。(包括交换式排序法、选择式排序法、插入式排序法)

外部排序: 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。(包括合并排序法和直接合并排序法)

交换式排序法,数据比较后,依判断规则对数据位置进行交换,以达到排序的目的。

①冒泡排序法(Bubble sort)

②快速排序法(Quick sort)

选择式排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。

①选择排序法(Select sort)

②堆排序法(Heap Sort)

插入式排序法,是对欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

①插入排序法(Insertion sort)

②希尔排序法(Shell sort)

③二叉树排序法(Binary-tree sort)

其它排序法。

①选堆排序法

②合并排序法

2.冒泡排序法

public static int[] bubble(int[] array){

int temp=0;

for(int i=0;i<array.length;i++){ //外层循环,决定一共走几趟

for(int j=0;j<array.length-1-i;j++){ //内层循环,开始逐个比较,发现前一个数比后一个数大则交换

if(array[j]>array[j+1]){

temp=array[j];

array[j]=array[j+1];

array[j+1]=temp;

// array[j]=array[j]+array[j+1];

// array[j+1]=array[j]-array[j+1];

// array[j]=array[j]-array[j+1];

}

}

}

return array;

}

3.选择排序法:

public static int[] select(int[] array){

int temp=0;

for(int j=0;j<array.length;j++){

//我认为第一个数就是最小的

int min=array[j];

//记录最小数的下标

int minIndex=j;

for(int k=j+1;k<array.length;k++){

if(min>array[k]){

//修改最小

min=array[k];

minIndex=k;

}

}

temp=array[j];

array[j]=array[minIndex];

array[minIndex]=temp;

}

return array;

}

4.插入排序法:

public static int[] insert(int[] array){

for(int i=1;i<array.length;i++){

int insertVal=array[i];

//insertval准备和前一个数比较

int index=i-1;

while(index>=0&&insertVal<array[index]){

//把array[index]向后移动

array[index+1]=array[index];

//让index向前移动

index--;

}

//将insertVal插入到适当位置

array[index+1]=insertVal;

}

return array;

}

5.快速排序法(交换式排序法):

public static int[] quick(int[] array){

int left=0;

int right=array.length-1;

return px(left, right, array);

}

public static int[] px(int left,int right,int[] array){

int l=left,r=right;

int privot=array[(l+r)/2];

int temp=0;

while(l<r){

while(array[l]<privot) l++;

while(array[r]>privot) r--;

if(l>=r) break;

temp=array[l];

array[l]=array[r];

array[r]=temp;

if(array[l]==privot) --r;

if(array[r]==privot) ++l;

}

if(l==r){

l++;

r--;

}

if(left<r) px(left,r,array);

if(right>l) px(l, right, array);

return array;

}

5.几种排序方法运行时间的比较:

随机生成十万个1~10000的数并存放到数组中。

int[] array=new int[100000];

for(int i=0;i<array.length;i++){

array[i]=(int)(Math.random()*10000);

}

排序前打印系统时间,排序后打印系统时间。

Calendar calendar=Calendar.getInstance();

System.out.println("排序前:"+calendar.getTime());

bubble(array);

calendar=Calendar.getInstance();

System.out.println("排序后:"+calendar.getTime());

发现排序时间大约是16秒

换成选择排序法:

Calendar calendar=Calendar.getInstance();

System.out.println("排序前:"+calendar.getTime());

select(array);

calendar=Calendar.getInstance();

System.out.println("排序后:"+calendar.getTime());

大约4秒钟

换成插入排序法:

Calendar calendar=Calendar.getInstance();

System.out.println("排序前:"+calendar.getTime());

insert(array);

calendar=Calendar.getInstance();

System.out.println("排序后:"+calendar.getTime());

大约3秒钟

换成快速排序法:

Calendar calendar=Calendar.getInstance();

System.out.println("排序前:"+calendar.getTime());

quick(array);

calendar=Calendar.getInstance();

System.out.println("排序后:"+calendar.getTime());

几乎没有排序时间。

6.浅测快速排序法

刚刚测试十万个数发现几乎没有排序时间。

我又测试了一百万个,发现还是没什么排序时间。

直到测试了一千万个:

发现仅有1s的排序时间。

那是不是快速排序法就是最好的呢?

不是,快速排序法在运行的时候对cpu和内存的占用是非常大的,其他排序法并不像快速排序法占用这么多。

四、查找

在java中我们常用的查找有两种

①顺序查找(最简单,效率最低的查找方法,一个一个找)

②二分查找(先排序,再择中查找,效率高)

public static void find(int val,int[] array){

int leftIndex=0;

int rightIndex=array.length-1;

f(leftIndex, rightIndex, val, array);

}

public static void f(int leftIndex,int rightIndex,int val,int array[]){

int midIndex=(rightIndex+leftIndex)/2;

int midVal=array[midIndex];

if(rightIndex>=leftIndex){

if(midVal>val){

f(leftIndex, midIndex-1, val, array);

}else if(midVal<val){

f(midIndex+1, rightIndex, val, array);

}else if(midVal==val){

System.out.println("找到此数,下标为"+midIndex);

}

}

}

二分查找要求数组已经是排好序(从小到大)的数组,所以我们一般先排序再使用二分查找。

时间: 2024-11-07 10:56:06

(八)数组以及排序和查找的相关文章

数组的排序与查找

/**对如下一个数组int[] iarr={34,67,1,56,32,78,12,45,79,4,57,102,123,3};进行排序(采用自己擅长的排序算法),然后查询排序之后的采用二分查找*法查找45在在数组的索引值 ,排序.查找封装成方法,然后在main方法中调用测试.*/ public class FenDou01 { public static void main(String[] args) { int[] iarr={34,67,1,56,32,78,12,45,79,4,57,

第四节 数组的排序和查找

插入排序 插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序. 例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序: 第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中: 第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中...... 第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序. 以下面5个无序的数据为例: 65 27 59 64 58

数组常见排序与查找

冒泡排序: 相邻元素两两比较,大的往后放.第一次排序完毕后,最大值就出现在最大索引出.此方法排序需要比较数组长度-1次 int[] arr = { 24, 65, 87, 57, 12,}; for (int i = 0; i < arr.length-1; i++) { for (int j = 0; j < arr.length-1-i; j++) { if(arr[j]>arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1

php的数组、排序、查找

//创建数组,其值可以放任意的数据类型     $arr[0]=111;     $arr[1]=121;     $arr[2]="nihao";     $arr[3]=141.9;     $arr[4]=null;//null要记入长度,并要占用空间,但是不会输出     echo "数组长度".count($arr);       //遍历数组中的值   for($i=0;$i<count($arr);$i++){         echo &quo

java 数组比较,元素的比较,Comparable,Comparator比较的应用实现,排序,查找示例

java 数组比较,元素的比较,自定义Comparator的实现,排序,查找示例 package org.rui.array.compar; import java.util.Arrays; import java.util.Random; import org.rui.generics.anonymity.Generator; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,

数组的高级(排序和查找)

1.冒泡排序:相邻元素两两比较,大的向后方法,第一次完毕后,最大值就出现在了最大索引出.同理,继续,即可得到一个排好序的数组. 2.冒泡排序的规则: 1).两两比较,大的往后方法. 2).第一次比较完毕后,下一次比较的时候就会减少一个元素的比较. 3).第一次比较,有0个元素不比. 第二次比较,有1个元素不比. 第三次比较,有2个元素不比. ...... 4).总共需要比较数组的长度-1次. 3.冒泡排序图解 4.代码实现 package cn; /**  * 数组排序之冒泡排序   */ pu

9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置

/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置. */ 两种方法: 方法一: /** * 思路:套用排序算法,并修改比较器.这里比较器用来指示两个字符串胡伟变位词就是相等的. * @param array */ public static void sort(String[] array){ Arrays.sort(array, new AnagramComparator()); } class AnagramComparator implements Comparator

所有的排序、查找算法

import javax.mail.Part; /** * 顺序查找.排序 * * @author 曾修建 * @version 创建时间:2014-7-30 下午04:15:10 */ public class SequentialSearch { public static void main(String[] args) { Integer[] a = {1,2,3,4,5,7,6,88}; //二分查找非递归 System.out.println( "二分查找非递归实现 位置 : &qu

数组的排序

数组:是一个装大批量同类型数据的容器 变量:是一个装数据的空间----一个变量只能装一个数据 开一个变量-----开一个房间 开一个数组---开多个同类型房间 二维数组:也是一个装大批来那个同类型数据的容器 一维数组:盖一层的楼房 二维数组:盖多层的楼房 一位数组 二位数组 int[] int[][] double[] double[][] char[] char[][] 二维数组的定义: 第一步:开一条街 数组类型 数组名=new 变量类型[层数][间数]: int[][] arr: //标识