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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组的高级(排序和查找)相关的知识,希望对你有一定的参考价值。

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

}


本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1860358

以上是关于数组的高级(排序和查找)的主要内容,如果未能解决你的问题,请参考以下文章

数组高级部分--排序,查找

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

常用类

数据结构算法设计模式

以下代码片段的时间复杂度是多少?

c语言排序和查找?