在软件开发中,有两个常见的任务,一个是某一组中查找某个特定的元素,另一个是将某一组元素按照特定的顺序排序。我们可以使用多种算法来完成这些任务,而这些算法的差异也是值得我们去仔细研究的,接下来我们探究一下这些算法。


一、查找

1.1、线性查找法
线性查找就是通过索引对数组data的每个元素进行遍历,如果发现要找的目标元素和数组data中的某个元素相同时,就返回已经查找到,当然,我们也是可以改进一下,就是直接把找到的元素返回即可。

public static <T extends Comparable<? super T>>
boolean linearSearch(T[] data, int min , it max, T target)
{int index = min;boolean found = false;while(!found && index <= max){//判断界限if(data[index].compareTo(target) == 0){found = true;}index++;}return found;
}

1.2、二分查找法
二分查找法的效率比线性搜索法高,因为不用全部遍历一遍,节省了很多的时间,这里我们采用的方法是递归调用来进行查找的,如果发现中点位置的元素大小小于目标元素,就将中点位置的索引+1,进行递归调用,如果大于目标元素,就将中点位置索引-1,进行递归调用,而递归的出口就是,当中点位置的值和目标元素的值相等时,则返回结果。

public static <T extends Comparable<? super T>>
boolean binarySearch(T[] data, int min , it max, T target)
{boolean found = false;int midpoint = (min+max)/2;//选择中点位置if(data[midpoint].compareTo(target) == 0){found = true;} else if(data[midpoint].compareTo(target) > 0){if(min <= midpoint - 1){found = binarySearch(data, min, midpoint - 1, target);}} else if(data[midpoint].compareTo(target) > 0){if(max >= midpoint + 1){found = binarySearch(data, min, midpoint + 1, target);}
}

二、排序

排序分为
顺序排序:选择,插入,冒泡排序;
对数排序:快速,归并排序;

2.1、选择排序
通过扫描整个列表找出最小值,将这个值与该列表的第一个位置的值交换。扫描剩余(除了第一个值)部分列表并找出最小值,然后将它和该列表的第二个位置处的值交换。以此类推下去。

public static <T extends Comparable<? super T>>
void selectionSort(T[] data){int min ;//定义存储扫描的最小值T temp;for(itn index = 0; index < data.length - 1; index++){min = index;//初始化为最小值为第一个for(int scan = index + 1; scan < data.length - 1; scan++){if(data[scan].compareTo(data[min]) < 0){//如果小于最小值,就将找到的最小值赋值给当前的最小值min = scan;}}//将找到的最小值和当前的第一个位置交换temp = data[min];data[min] = data[index];data[index] = temp;}
}

外层循环控制下一个最小值将保存在数组中的哪个位置,内层循环通过扫描所有大于或者等于外层循环制定索引的位置来查找剩余部分的列表的最小值。

这里提取一个互换的函数

//两个元素交换位置
private static <T extends Comparable<T>> void swap
(T[] data, int index1, int index2){T temp = data[index];data[index1] = data[index2];data[index2] = temp;
}

2.2、插入排序
插入排序算法通过反复的将某个特定的值插入到该列表某个已排序的子集中来完成对列表值得排序。
策略:将列表中的头两个值依据其相对大小对其进行排序,将列表的第三个值插入到头两个已排序的值中的恰当位置,然后将第四个值插入到前三个已排序的恰当位置。

public static <T extends Comparable<? super T>>
void selectionSort(T[] data){for(int index = 1; index < data.length; index++){T key = data[index];//将这个元素暂时保存int position = index;//外层循环保存索引//查找更大的元素到对的位置while(position > 0 && data[position - 1].compareTo(key) > 0){data[position] = data[position - 1];position --;}data[position] = key;}
}

2.3、冒泡排序
重复的比较列表中的相邻的元素,如果发现某个相邻的元素的位置不对的时候,就将这两个元素的位置交换。

public static <T extends Comparable<? super T>>
void selectionSort(T[] data){int position ,scan;T temp;for(position = data.length - 1; position >=0; position --){for(scan = 0; scan <= position - 1; scan++){if(data[scan].compareTo(data[scan+1]) > 0){swap(data,scan, scan + 1);}}}
}

2.4、快速排序
通过任意选定的分区元素将该列表分区,然后对分区元素的任一边的子列表进行递归排序。

public static <T extends Comparable<T>> void quickSort(T[] data){quickSort(data, 0, data.length-1);
}public static <T extends Comparable<T>> void quickSort(T[] data, min , max){if(min < max){//创建分区索引int indexOfPartition = partition(data, min, max);//对左分区进行递归排序quickSort(data, min, indexOfPartition -1);//对右分区进行递归排序quickSort(data, indexOfPartition + 1, max);}
}public static <T extends Comparable<T>> void partition(T[] data, int min , int max){T partitionelement;int left, right;int middle = (min+max)/2;//使用中间数据值作为分区元素partitionelement = data[middle];//将第一个元素和分区元素交换位置swap(data,middle,min);left = min;right = max;while(left < right){//如果左边的元素比分区元素小就索引右移查找下一个while(left< right && data[left].compareTo(partitionelement) <= 0){left ++;}//如果右边元素比分区元素大就索引左移查找下一个元素while(data[right].compareTo(partitionelement) > 0){right ++;}if(left < right){swap(data,left,right);}}//将分区元素放回到原来的位置swap(data, min, right);return right;
}

2.5、归并排序

将列表分成大约相等的两个部分,然后对每一部分列表递归调用其本身,继续该列表的递归分解,直至达到该递归的基本情形,这是列表被分割成长度为1的列表,根据定义,此时已排序好。

private static <T extends Comparable<T>> void mergeSort(T[] data, int min , int max){if(min < max){int mid = (min+max)/2;mergeSort(data,min,mid);mergeSort(data,mid+1,max);merge(data,min,mid,max);}
}private static <T extends Comparable<T>> void merge(T[] data, int first , int mid, int  last){T[] temp = (T[])(new Comparable[data.length]);int first1 = first, last1 = mid;int first2 = mid+1, last2 = last;int index = first1;//复制每一个子序列中的更小的元素到temp数组中,直到已排序好while(first1 <= last1 && first2 <= last2){if(data[first1].compareTo(data[first2]) < 0){temp[index] = data[first1];first1++;} else {temp[index] = data[first2];first2++;}index++;}//从第一个子序列中复制剩余的元素到temp数组中while(first1 <= last1){temp[index] = data[first1];first1++;index++;}//从第二个子序列中复制剩余的元素到temp数组中while(first2 <= last2){temp[index] = data[first2];first2++;index++;}//复制归并数据temp到原始的序列中for(index = first; index <= last; index++){data[index] = temp[index];}
}

数据结构与算法-排序与查找(java描述)相关推荐

  1. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 优先级队列 — 左高树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 优先级队列 - 左高树 一.左高树 1.外部节点 2.高度优先左高树 (1)定义 (2)特性 (3)HBLT 与 大小根树 3. ...

  2. 数据结构、算法与应用c++语言描述(答案)

    数据结构.算法与应用c++语言描述(答案) https://www.cise.ufl.edu/~sahni/dsaac/view.htm   本身不是计算机专业的,属于那种自学半路出家的,最近刚开始看 ...

  3. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 回溯法

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 回溯法 一.算法思想 二.货箱装载 1.问题描述 2.回溯算法 3.实现 4.测试代码 一.算法思想 回溯法是搜索问题解的一种系 ...

  4. 《数据结构、算法与应用 —— C++语言描述》学习笔记 — 竞赛树

    <数据结构.算法与应用 -- C++语言描述>学习笔记 - 竞赛树 一.赢者树 二.二叉树的数组描述(补充) 1.声明 2.实现 三.赢者树 1.抽象数据类型 2.赢者树的表示 3.声明 ...

  5. java 数据结构和算法 排序

    排序算法 排序算法的介绍 算法的时间复杂度 **度量一个程序(算法)执行时间的两种方法** **时间频度** **时间复杂度** **常见的时间复杂度** 平均时间复杂度和最坏时间复杂度 算法的空间复 ...

  6. 数据结构与算法:二分查找

    二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...

  7. 【数据结构与算法】二分查找

    一.什么是二分查找? 二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0. 二.时间复杂度分析? 1.时间复杂度 ...

  8. 数据结构与算法《二分查找》

    数据结构与算法(java)<二分查找> 基本二分查找public class BinarySearch {/*** 1.定义一个有序数组,* 2.定义两个变量i,j* 3.定义一个待查找的 ...

  9. 数据结构与算法 / 排序算法 / 堆排序

    一.定义 借助堆结构实现的排序算法被称为堆排序. 二.过程说明 1.建堆 (1)方法1 原地建堆,对于数组来说,从前往后:对于树来说,从下向上. 将数组的第一个元素作为堆顶,第二个元素做向堆中插入数据 ...

最新文章

  1. 竞拍AI教父Hinton
  2. Application provided invalid, non monotonically increasing dts to muxer in stream 0: -92233720368547
  3. 设计模式十三:proxy(代理)——对象结构型模式
  4. ALL in BERT:一套操作冲进排行榜首页
  5. java 枚举工厂_在Java中使用枚举工厂,最佳做法?
  6. JS中的异步任务有哪些
  7. Latex 生成的PDF增加行号 左右两边
  8. 计算机硬盘不识别u盘启动,快启动U盘启动pe系统无法识别硬盘怎么办?
  9. 【最新最热12款】Java游戏项目_Java游戏开发_Java小游戏_王者荣耀_超级玛丽_黄金矿工_贪吃蛇_坦克大战_俄罗斯方块_推箱子_飞机大战_扫雷_桌球
  10. win10官方原版iso镜像 下载地址
  11. 信息安全快讯丨叶落知秋,e讯知安全
  12. Zoommy for mac(图片素材搜索下载软件)
  13. Spring Destroying singletons ... root of factory hierarchy 问题【已解决】
  14. java、简单练习题
  15. 42. OP-TEE中secure stroage------安全文件的创建
  16. 【第47题】超级楼梯加强版 | 泰波那契数列
  17. mysql infile ignore_mysql导入数据load data infile用法
  18. git从本地仓库更新项目到远程仓库指定分支
  19. VVC代码学习之自定义数据结构阅读4
  20. arduino esp8266web esp32web

热门文章

  1. 波卡链Substrate (5)托盘Pallets进阶
  2. 什么是浏览器跨域访问操作,js如何实现?
  3. 替换IP java代码
  4. 密码技术应用--SM2文件签名验签
  5. CFileDialog 打开多个目录下的多个文件
  6. 广西中专机器人应用与维护_我校2018级工业机器人应用与维护专业跟岗实习
  7. VirtualKD + VMWare双机调试(失败)
  8. 红队攻防之从边界突破到漫游内网(无cs和msf)
  9. 某平台的一次简单渗透测试记录
  10. TeamTNT通过模仿WatchDog团伙来掩盖其加密劫持足迹