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

1.冒泡排序:相邻元素两两比较,大的向后方法,第一次完毕后,最大值就出现在了最大索引出。同理,继续,即可得到一个排好序的数组。

2.冒泡排序的规则:

1).两两比较,大的往后方法。

2).第一次比较完毕后,下一次比较的时候就会减少一个元素的比较。

3).第一次比较,有0个元素不比。

第二次比较,有1个元素不比。

第三次比较,有2个元素不比。

......

4).总共需要比较数组的长度-1次。

3.冒泡排序图解

4.代码实现

package cn;
/**
 * 数组排序之冒泡排序 
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {24,69,80,57,33};

		//遍历数组,数组排序前
		printArray(arr);//[24, 69, 80, 57, 33]

		//第一次比较
		//arr.length -1为了防止越界
		//arr.length -1 - 0 为了减少比较的次数
		for (int i = 0; i < arr.length -1 - 0; i++) {
			if(arr[i]>arr[i+1]){
				int temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}

		//第一次比较后的数组为
		printArray(arr);//[24, 69, 57, 33, 80]

		//第二次比较
		//arr.length -1为了防止越界
		//arr.length -1 -1 减少比较的次数
		for (int i = 0; i < arr.length -1 -1; i++) {
			if(arr[i]>arr[i+1]){
				int temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}

		//第二次比较后的数组为
		printArray(arr);//[24, 57, 33, 69, 80]

		//第三次比较
		//arr.length -1为了防止越界
		//arr.length -1 -2 减少比较的次数
		for (int i = 0; i < arr.length -1 -2; i++) {
			if(arr[i]>arr[i+1]){
				int temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}

		//第三次比较后的数组为
		printArray(arr);//[24, 33, 57, 69, 80]

		//第四次比较
		//arr.length -1为了防止越界
		//arr.length -1 -3 减少比较的次数
		for (int i = 0; i < arr.length -1 -3; i++) {
			if(arr[i]>arr[i+1]){
				int temp = arr[i];
				arr[i] = arr[i+1];
				arr[i+1] = temp;
			}
		}

		//第四次比较的数组为
		printArray(arr);//[24, 33, 57, 69, 80]

	}
	/**
	 * 遍历数组
	 * @param array
	 */
	public static void printArray(int[] array){
		System.out.print("[");
		for (int i = 0; i < array.length; i++) {
			if(i == array.length -1){
				System.out.println(array[i]+"]");
			}else{
				System.out.print(array[i]+", ");
			}
		}
	}

}

优化

package cn;
/**
 * 数组排序之冒泡排序 
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {24,69,80,57,33};

		//遍历数组,数组排序前
		printArray(arr);//[24, 69, 80, 57, 33]

		for (int i = 0; i < arr.length -1; i++) {//w外层控制的是比较的次数=数组的长度-1
			for (int j = 0; j < arr.length - 1 - i; j++) {//内循环控制的是每次需要比较的元素 
				/**
				 * 第一次,是5个元素比较
				 * 第二次,是4个元素比较
				 * 第三次,是3个元素比较
				 * 第四次,是2个元素比较
				 * 第五次,是1个元素比较 不过 有这必要吗 没有 不需要比较 数组的元素已经排序了
				 */
				if(arr[j] > arr[j+1]){
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}

		//排序后的数组
		printArray(arr);//[24, 33, 57, 69, 80]

	}
	/**
	 * 遍历数组
	 * @param array
	 */
	public static void printArray(int[] array){
		System.out.print("[");
		for (int i = 0; i < array.length; i++) {
			if(i == array.length -1){
				System.out.println(array[i]+"]");
			}else{
				System.out.print(array[i]+", ");
			}
		}
	}

}

5.选择排序

从0索引开始,依次和后面元素比较,小的往前方法,第一次完毕,最小值出现在了最小索引出。其他的同理,可以得到一个排好序的数组。

6.选择排序原理

7.选择排序的代码实现

package cn;
/**
 * 数组排序之选择排序
 *
 */
public class ArrayDemo2 {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = new int[]{24,69,80,57,13};

		//排序前的数组为
		printArray(arr);//[24, 69, 80, 57, 13]

		//第一次
		for (int i = 1; i < arr.length; i++) {
			if(arr[0] > arr[i]){
				int temp = arr[i];
				arr[i] = arr[0];
				arr[0] = temp;
			}
		}

		System.out.println("第一次排序后的数组");
		printArray(arr);//[13, 69, 80, 57, 24]

		//第二次
		for (int i = 2; i < arr.length; i++) {
			if(arr[1] > arr[i]){
				int temp = arr[i];
				arr[i] = arr[1];
				arr[1] = temp;
			}
		}
		System.out.println("第二次排序后的数组");
		printArray(arr);//[13, 24, 80, 69, 57]

		//第三次
		for (int i = 3; i < arr.length; i++) {
			if(arr[2] > arr[i]){
				int temp = arr[i];
				arr[i] = arr[2];
				arr[2] = temp;
			}
		}
		System.out.println("第三次排序后的数组");
		printArray(arr);//[13, 24, 57, 80, 69]

		//第四次
		for (int i = 4; i < arr.length; i++) {
			if(arr[3] > arr[i]){
				int temp = arr[i];
				arr[i] = arr[3];
				arr[3] = temp;
			}
		}
		System.out.println("第四次排序后的数组");
		printArray(arr);//[13, 24, 57, 69, 80]

	}
	/**
	 * 遍历数组
	 * @param arr
	 */
	public static void printArray(int[] arr){
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if(i == arr.length -1){
				System.out.println(arr[i]+"]");
			}else{
				System.out.print(arr[i]+", ");
			}
		}
	}

}

优化

package cn;
/**
 * 数组排序之选择排序
 *
 */
public class ArrayDemo2 {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = new int[]{24,69,80,57,13};

		//排序前的数组为
		printArray(arr);//[24, 69, 80, 57, 13]

		for (int i = 0; i < arr.length -1; i++) {//外层循环控制每次最小值的索引上的值进行比较
			for (int j = i+1; j < arr.length; j++) {//内层循环将与外层循环的每次最小值的后一个索引上的值进行比较
				if(arr[j] < arr[i]){
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		System.out.println("排序后的数组:");
		printArray(arr);//[13, 24, 57, 69, 80]
	}
	/**
	 * 遍历数组
	 * @param arr
	 */
	public static void printArray(int[] arr){
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if(i == arr.length -1){
				System.out.println(arr[i]+"]");
			}else{
				System.out.print(arr[i]+", ");
			}
		}
	}

}

8.练习

package cn;
/**
 * 把字符串中的字符进行排序
 *  例如:"dacgebf"
 *  结果:"abcdefg"
 * 
 * 分析:
 * 	1.定义一个字符串
 *  2.把字符串转换为字符数组
 *  3.把字符数组进行排序
 *  4.把排序后的儿子富数组转换为字符串
 *  5.输出最后的字符串
 *
 */
public class ArrayTest {
	public static void main(String[] args) {
		//方法一:使用冒泡排序
		//定义一个字符串
		String str = "dacgebf";
		//把字符串转换为字符数组
		char[] chs = str.toCharArray();
		//把字符数组进行排序
		bubbleSort(chs);
		//把排序后的儿子富数组转换为字符串
		String sortedStr = String.valueOf(chs);
		//输出最后的字符串
		System.out.println("排序后的字符串:"+sortedStr);//排序后的字符串:abcdefg

		//方法二:使用选择排序
		String str2 = "dacgebf";
		//把字符串转换为字符数组
		char[] chas = str2.toCharArray();
		//把字符数组进行排序
		changeSort(chas);
		//把排序后的儿子富数组转换为字符串
		String sortedStr2 = new String(chas);
		//输出最后的字符串
		System.out.println("排序后的字符串:"+sortedStr2);//abcdefg

	}
	/**
	 * 冒泡排序
	 * @param chs
	 */
	public static void bubbleSort(char[] chs){
		for (int i = 0; i < chs.length -1; i++) {//外层控制的是比较的次数,是数组的长度-1
			for (int j = 0; j < chs.length -1 -i; j++) {//内层循环控制的是每次比较的元素 
				//chs.length -1是为了防止数组越界
				if(chs[j] > chs[j+1]){
					char temp = chs[j];
					chs[j] = chs[j+1];
					chs[j+1] = temp;
				}

			}
		}
	}
	/**
	 * 选择排序
	 * @param chs
	 */
	public static void changeSort(char[] chs){
		for (int i = 0; i < chs.length-1; i++) {//外层控制的是每次循环的最小值的索引
			for (int j = i+1; j < chs.length; j++) {//内层循环控制的是每次循环的最小值后面的数组中的元素的索引
				if(chs[i] > chs[j]){
					char temp = chs[i];
					chs[i] = chs[j];
					chs[j] = temp;
				}
			}

		}
	}
}

9.二分查找

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

		//调用方法
		int index = getIndex(arr, 33);
		System.out.println(index);//2

	}
	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){
			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;
	}

}
时间: 2024-08-06 00:17:11

数组的高级(排序和查找)的相关文章

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

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

数组的排序与查找

/**对如下一个数组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,

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

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][];  

java基础(16)、数组的高级应用--冒泡排序、选择排序

数组排序 目录 一. 冒泡排序 二. 选择排序 三. 优化选择排序 一. 冒泡排序 将数组元素按[从小到大排序]为例 思路:依次对临近的两个元素对比,将最大值放在数组最后:再将剩余的元素对比,大值放在剩余元素的最后. . . 以此循环,最后元素就是按从小到大排列. 1.1. 做之前,先了解这个操作:把数组的最大值放在末尾 将元素1和元素2对比,如果元素1的值大,则元素2和元素1的值互换(此时元素2为大值):再让元素2和元素3对比.  . ( 保留大值).  .  元素3和元素4对比 .  . 

javascript数据结构与算法--高级排序算法

高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法---- 希尔排序和快速排序. 一:希尔排序: 希尔排序的核心理念是:首先比较距离较远的元素,而非相邻的元素. 基本原理:通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔. 下面我们来看看数组[0,9,1,8,7,6,2,3,5,4] 来使用希尔排序的原理:如下图: 代码分析如下: 1. 执行 "间隔序列=3的步骤" A.

黑马程序员(Java)----API之常用类(数组的高级操作、正则表达式)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 4.7 Array的高级操作 4.7.1 排序 1.冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处. import java.awt.image.BufferStrategy; public class ArrayDemo2 { public static void main(String[] args) { // 定义一个数组 int[] arr = { 24,

数据结构之高级排序算法

一.希尔排序 希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量. 具体代码实现: 1 package data.struct.algorithm; 2 3 //高级排序算法之希尔排序 4 class

所有的排序、查找算法

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

高级排序之希尔排序

希尔排序对于多达几千个数据项的,中等大小规模的数组排序表现良好,希尔排序不像快速排序和其它时间复杂度为O(n*logn)的排序算法那么快,因此,对非常大的文件排序,它不是最优选择,但是希尔排序比选择排序和插入排序这种时间复杂度为O(n²)的排序要快的多,并且它非常容易实现,代码简短 希尔排序也是插入排序的一种,在插入排序中,如果最小的数在最后面,则复制的次数太多,而希尔解决了这个问题,它也是n-增量排序,它的思想是通过加大插入排序中元素的间隔,并在这些有间隔的元素中进行插入排序,当这些数据项排过

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序