(java学习之路之重新开始)数组常用算法总结

数组常用算法:排序,复制,查找,反转。接下来逐一介绍。

1.数组的排序

对于排序大家要做到能手写冒泡排序快速排序,而对于归并排序和堆排序而言,能说出其实现原理即可。

1.1 冒泡排序:比较简单,原理不再叙述。

package array.guigu.demo;

public class BubbleSortTest {

	public static void main(String[] args) {
		
		int[] arr = new int[] {43,32,76,-98,0,64,33,-21,32,99};
		
		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] = temp;
				}
				
			}
		}
		
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}
		
	}
	
}

1.2 快速排序: 分治思想,递归调用

package array.guigu.demo;
/**
 * 快速排序
 * 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,
 * 则分别对这两部分继续进行排序,直到整个序列有序。
 */
public class MyQuickSort {

	private static void swap(int[] data, int i, int j) {
		int temp = data[j];
		data[j] = data[i];
		data[i] = temp;
	}
	
	private static void subSort(int[] data, int start, int end) {
		
		if(start < end) {
			int base = data[start];
			int low = start;
			int high = end + 1; 
			
			while(true) {
				
				while(low < end && data[++low] - base <= 0)
					;
				while(high > start && data[--high] - base >= 0)
					;
				if(low < high) {
					swap(data, low, high);
				}else {
					break;
				}
			}
			swap(data, start, high);
			
			subSort(data, start, high - 1); //递归调用
			subSort(data, high + 1, end);
		}
		
	}
	
	
	public static void quickSort(int[] data) {
		subSort(data, 0, data.length - 1);
	}
	
	public static void main(String[] args) {	
		int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30};
		System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
		quickSort(data);
		System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
	}	
}

2.数组的复制

数组的复制并不是简单的赋值操作,这一点你要区分开。

package array.guigu.demo;

public class ArrayDemo06 {
	
	public static void main(String[] args) {
		
		//数组的复制
		int[] array1,array2;
		array1 = new int[]{1,2,3,4,5,6,7,8};
		
		array2 = new int[array1.length];
		
		for(int i = 0;i < array1.length;i++) {
			array2[i] = array1[i];
		}
		
		for(int i = 0;i < array2.length;i++) {
			System.out.print(array2[i] + "\t");
		}
	}
}	

3.数组的查找

3.1 顺序查找:

package array.guigu.demo;

public class ArrayDemo07 {

	public static void main(String[] args) {
		
		String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
		
		String dest = "BB";
		
		boolean isFlag = true;
		
		//线性查找
		for(int i = 0;i < arr.length;i++) {
			if(arr[i] == dest) {
				isFlag = false;
				System.out.println("存在!!");
				break;
			}
		}
		
		if(isFlag) {
			System.out.println("很遗憾,没有找到!!");
		}
	}
}

3.2 二分查找:前提是数组要有序

package array.guigu.demo;

public class ArrayDemo07 {

	public static void main(String[] args) {
		int[] arr2 = new int[] {-98,-34,2,34,54,66,79,105,210,333};
		
		int dest1 = -34;
		int head = 0;
		int end = arr2.length - 1;

		while(head <= end) {
			
			int middle = (head + end) / 2;
			
			if(arr2[middle] == dest1) {
				isFlag = false;
				System.out.println("找到了元素,位置是:" + middle);
				break;
			}else if(arr2[middle] > dest1) {
				end = middle - 1; 
			}else {
				head = middle + 1;
			}
		}
		
		if(isFlag) {
			System.out.println("未找到元素。。。");
		}

	}
	
}

4.数组的反转

4.1 第一种方法:

		String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
		
		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;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}

4.2 第二种方法:

		String[] arr = new String[] {"JJ","DD","MM","BB","GG","AA"};
		for(int i = 0,j = arr.length - 1;i < j;i++,j--) {
			String temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
		
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + "\t");
		}
发布了80 篇原创文章 · 获赞 69 · 访问量 8920

猜你喜欢

转载自blog.csdn.net/qq_43437122/article/details/105649651