《java入门第一季》之Arrays类前传(排序问题)

一:冒泡排序
/*
 * 数组排序之冒泡排序:
 * 		相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处
 *
 * 引申:
 * 利用冒泡排序法,可以获取一个数组的最大值(先冒泡排序,取最后一个值)和最小值(调用冒泡排序,取第一个值)
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);

		//由于可能有多个数组要排序,所以要写成方法
		bubbleSort(arr);
		System.out.println("排序后:");
		printArray(arr);
	}

	//冒泡排序代码
	public static void bubbleSort(int[] arr){
		for (int x = 0; x < arr.length - 1; x++) {//外循环控制比较的次数(arr.length-1)轮
			for (int y = 0; y < arr.length - 1 - x; y++) {// arr.length - 1是为了防止数据越界,// arr.length - 1 - x是为了减少比较的次数
				if (arr[y] > arr[y + 1]) {//前面的数大于后边的数。交换
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]+"]");
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
	}
}

二:选择排序

/*
 * 数组排序之选择排序:
 * 		从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);

		//用方法改进
		selectSort(arr);
		System.out.println("排序后:");
		printArray(arr);

	}

	public static void selectSort(int[] arr){
		for(int x=0; x<arr.length-1; x++){//总共进行arr.length-1轮
			for(int y=x+1; y<arr.length; y++){
				if(arr[y] <arr[x]){//如果后面的数小于前面的数,交换,始终使得前面的为小值
					int temp = arr[x];
					arr[x] = arr[y];
					 arr[y] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}
}

三:二分查找

/*
 * 查找:
 * 		基本查找:数组元素无序(从头找到尾)
 * 		二分查找(折半查找):数组元素有序
 *
 * 分析:
 * 		A:定义最大索引,最小索引
 * 		B:计算出中间索引
 * 		C:拿中间索引的值和要查找的值进行比较
 * 			相等:就返回当前的中间索引
 * 			不相等:
 * 				大	左边找
 * 				小	右边找
 * 		D:重新计算出中间索引
 * 			大	左边找
 * 				max = mid - 1;
 * 			小	右边找
 * 				min = mid + 1;
 * 		E:回到B
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {11,22,33,44,55,66,77};

		//写功能实现
		int index = getIndex(arr, 33);
		System.out.println("index:"+index);

		//假如这个元素不存在后有什么现象呢?
		index = getIndex(arr, 333);
		System.out.println("index:"+index);//-1
	}

	public static int getIndex(int[] arr,int value){
		//定义最大索引,最小索引
		int max = arr.length -1;
		int min = 0;

		//计算出中间索引
		int mid = (max +min)/2;

		//拿中间索引的值和要查找的值进行比较
		while(arr[mid] != value){//while实现循环
			if(arr[mid]>value){//大
				max = mid - 1;//左边找
			}else if(arr[mid]<value){//小
				min = mid + 1;//右边找
			}

			//加入判断
			if(min > max){//找不到
				return -1;
			}

			mid = (max +min)/2;//重新取新一轮数组的中间值
		}

		return mid;//arr[mid] = value
	}
}
时间: 2024-08-03 08:09:44

《java入门第一季》之Arrays类前传(排序问题)的相关文章

Java入门第一季——从此投身Java??

找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季  一.简介 1.1 Java SE--基础核心: 以此为基础,又分为Java EE(企业应用开发,JSP等),Java ME(嵌入式开发,安卓等): JVM(Java Virtual Machine): Java虚拟机,使Java代码可以跨平台运行: .java-->编译器-->.class-->解

《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)

根据排序算法,可以解决一些小案例.举例如下: /* * 把字符串中的字符进行排序. * 举例:"dacgebf" * 结果:"abcdefg" * * 分析: * A:定义一个字符串 * B:把字符串转换为字符数组 * C:把字符数组进行排序 * D:把排序后的字符数组转成字符串 * E:输出最后的字符串 */ public class ArrayTest { public static void main(String[] args) { // 定义一个字符串 S

《java入门第一季》之Arrays类

前面介绍了排序问题(见博客http://blog.csdn.net/qq_32059827/article/details/51362390):二分查找问题(见博客http://blog.csdn.net/qq_32059827/article/details/51363949) 接下来用一个类快速实现排序和二分查找.Arrays类 import java.util.Arrays; /* * Arrays:针对数组进行操作的工具类.比如说排序和查找. * 1:public static Stri

慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴~~). Arrays 中常用的方法: 1. 排序 语法:  可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列),如: 运行结果: 2. 将数组转换

Java入门第一季

慕课网:http://www.imooc.com/learn/85 Java入门知识第一季 1.Java开发环境和IDE的使用: 2.变量和常量 3.常用的运算符 4.流程控制语句 5.数组:使用Arrays操作数组.foreach循环遍历数组 6.方法的定义,重载调用 跟着慕课网的教程,去一步一步补充完成小练习中的代码,学习效率会比较高~

java入门第一季_1.6_数组

既然选择了远方,便只顾风雨兼程. 数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. public class Demo1 { public static void main(String[] args) { // 定义一个数组,保存五名学生的成绩 int[] scores = { 78, 93, 97, 84, 63 }; // 输出数组中的第二个成绩 System.out.println

慕课网-Java入门第一季-6-8 使用 foreach 操作数组

来源:http://www.imooc.com/code/1864 foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是“ for 每一个”的意思,那么到底怎么使用 foreach 语句呢? 语法: 我们分别使用 for 和 foreach 语句来遍历数组 运行结果: 看到 foreach 的方便了吧!! 留个思考问题给大家:如果想在 foreach 语句中获取数组元素的下标,该

《java入门第一季》之面向对象(谈谈接口)

软件中有接口,这里的接口与硬件中的接口还是有很大区别的. 这里介绍接口不考虑JDK8的新特性(JDK8开始接口里面可以有非抽象方法了,介绍JDK8新特性可能要到整个第一季写完吧!) 还是直接进入接口的学习: /* 接口的特点: A:接口用关键字interface表示 interface 接口名 {} B:类(实现)接口用implements(执行,实现)表示 class 类名 implements 接口名 {} C:接口不能实例化,就是说不能凭空的创建对象 那么,接口如何实例化呢? 按照多态的方

《java入门第一季》之类面试题

面试题一: String,StringBuffer,StringBuilder的区别? * A:String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的. * B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高 面试题二: StringBuffer和数组的区别?而它是最常用的,功能和StringBuffer完全一样 * 二者都可以看成是一个容器,装其他的数据. * 但是呢,StringBuffe