博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数组-常见算法
阅读量:4203 次
发布时间:2019-05-26

本文共 4227 字,大约阅读时间需要 14 分钟。

可以看这个网站(上面可以根据程序执行看到动画效果):

这个网站汇聚了各种算法,可以用程序和动画结合的方式学习,大家想详细理解算法,可以借助这个网站。

1. 冒泡排序算法

冒泡排序算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最
    后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
import java.util.Arrays;public class Test {
public static void main(String[] args) {
int[] values = {
3, 1, 6, 2, 9, 0, 7, 4, 5, 8}; bubbleSort(values); System.out.println(Arrays.toString(values)); } public static void bubbleSort(int[] values) {
int temp; for (int i = 0; i < values.length; i++) {
for (int j = 0; j < values.length - 1 - i; j++) {
if (values[j] > values[j + 1]) {
temp = values[j]; values[j] = values[j + 1]; values[j + 1] = temp; } } } }}

2. 冒泡排序的优化算法

其实,我们可以把冒泡排序的算法优化一下,基于冒泡排序的以下特点:

  1. 整个数列分成两部分:前面是无序数列,后面是有序数列。
  2. 初始状态下,整个数列都是无序的,有序数列是空。
  3. 每一趟循环可以让无序数列中最大数排到最后,(也就是说有序数列的元素个数增加1),也就是不用再去顾及有序序列。
  4. 每一趟循环都从数列的第一个元素开始进行比较,依次比较相邻的两个元素,比较到无序数列的末尾即可(而不是数列的末尾);如果前一个大于后一个,交换。
  5. 判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了,此时可以中止比较。
import java.util.Arrays;public class Test{
public static void main(String[ ] args) {
int[ ] values = {
3, 1, 6, 2, 9, 0, 7, 4, 5, 8 }; bubbleSort(values); System.out.println(Arrays.toString(values)); } public static void bubbleSort(int[ ] values) {
int temp; int i; // 外层循环:n个元素排序,则至多需要n-1趟循环 for (i = 0; i < values.length - 1; i++) {
// 定义一个布尔类型的变量,标记数组是否已达到有序状态 boolean flag = true; /*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序 数组的最后*/ for (int j = 0; j < values.length - 1 - i; j++) {
// 如果前一个元素大于后一个元素,则交换两元素的值; if (values[j] > values[j + 1]) {
temp = values[j]; values[j] = values[j + 1]; values[j + 1] = temp; //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较; flag = false; } } //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。 if (flag) {
break; } } }}

3. 选择排序算法

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法步骤

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。
import java.util.Arrays;public class Test{
public static void main(String[] args) {
int[] values = {
3, 1, 6, 2, 9, 0, 7, 4, 5, 8}; selectSort(values); System.out.println(Arrays.toString(values)); } public static void selectSort(int[] values){
for(int i=0;i
values[j]){
min = j; } } if(min!=i) {
int tmp = values[min]; values[min] = values[i]; values[i] = tmp; } } }}

4. 二分法查找

二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;

否则,若 key 小,则在数组前半部分中继续进行二分法检索;若 key 大,则在数组后半部分中继续进行二分法检索。
这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。
二分法检索是一种效率较高的检索方法。比如,我们要在数组[7, 8, 9, 10, 12, 20, 30, 40, 50,
80, 100]中查询到 10 元素,过程如下:
在这里插入图片描述

import java.util.Arrays;public class Test{
public static void main(String[] args) {
int[] arr = {
30,20,50,10,80,9,7,12,100,40,8}; int searchWord = 20; // 所要查找的数 Arrays.sort(arr); //二分法查找之前,一定要对数组元素排序 System.out.println(Arrays.toString(arr)); System.out.println(searchWord+"元素的索引: "+binarySearch(arr,searchWord)); } public static int binarySearch(int[] array, int value){
int low = 0; int high = array.length - 1; while(low <= high){
int middle = (low + high) / 2; if(value == array[middle]){
return middle; //返回查询到的索引位置 } if(value > array[middle]){
low = middle + 1; } if(value < array[middle]){
high = middle - 1; } } return -1; //上面循环完毕,说明未找到,返回-1 }}

转载地址:http://zqpli.baihongyu.com/

你可能感兴趣的文章
java基本数据类型
查看>>
a++运算符
查看>>
repo 的一些用法和理解
查看>>
Android如何防止apk程序被反编译
查看>>
如何提高Android代码的安全性
查看>>
Android应用如何实现换肤功能
查看>>
UNIX IO---再谈文件描述符
查看>>
dup,dup2
查看>>
signal(SIGPIPE, SIG_IGN)
查看>>
cc、gcc、g++、CC的区别概括
查看>>
《大话设计模式》之--第1章 代码无错就是优?----简单工厂模式
查看>>
adb 协议
查看>>
android2.3-adb源码分析
查看>>
linux下解压或压缩文件方法
查看>>
如何让新人尽快融入团队
查看>>
Android 4.0新的广播机制FLAG_EXCLUDE_STOPPED_PACKAGES
查看>>
Android 唯一识别码
查看>>
Android之我是ADB
查看>>
浅析adb创建流程
查看>>
浅析linux开发工具adb具体实现
查看>>