java中的基本算法

栏目: 编程工具 · 发布时间: 6年前

内容简介:整理一下常用的又基础的算法。由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方。1.链表链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是用来存储数据的,与链表相比,需要初始化时确定长度。一个数组内的数据都是同一类型。在Java中,ArrayList是通过数组实现,而LinkedList则通过链表实现。一个简单的链表类如下:
编辑推荐:
本文来自于cnblogs,本文主要介绍了 java 中的链表、二叉树以及冒泡排序、快速排序等几种 排序 方法,希望对大家能有所帮助。

整理一下常用的又基础的算法。由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方。

1.链表

链表用来存储数据,由一系列的结点组成。这些结点的物理地址不一定是连续的,即可能连续,也可能不连续,但链表里的结点是有序的。一个结点由数据的值和下一个数据的地址组成。一个链表内的数据类型可以是多种多样的。数组也是用来存储数据的,与链表相比,需要初始化时确定长度。一个数组内的数据都是同一类型。在Java中,ArrayList是通过数组实现,而LinkedList则通过链表实现。一个简单的链表类如下:

 public class Node{
 private Object data;
 private Node next;
 public Node(Object data){
 this.data = data;
 } 
 //省略set、get方法
 }

2.二叉树

二叉树是n(n>=0)个结点的有序集合。每个结点最多有2个子节点,即左结点和右结点,且左右结点顺序不能更改。

当n=0时,为空二叉树;当n=1时,为只有一个根二叉树。

 public class BinTree {
 private BinTree lChild;//左结点
 private BinTree rChild;//右结点 
 private Object data; //数据域 
 public BinTree getlChild() {
 return lChild;
 }
 public void setlChild(BinTree lChild) {
 this.lChild = lChild;
 }
 public BinTree getrChild() {
 return rChild;
 }
 public void setrChild(BinTree rChild) {
 this.rChild = rChild;
 }
 public Object getData() {
 return data;
 }
 public void setData(Object data) {
 this.data = data;
 } 
 }

3.排序

(1)冒泡排序

重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。时间复杂度 O(n2),为稳定算法。

将数依次进行比较,并将大(或小)的,网后放,如下:

 public static void bubbleSort(int []arr) {
 for(int i =0;i<arr.length-1;i++) {
 for(int j=0;j<arr.length-i-1;j++) { //-1为了防止溢出
 if(arr[j]>arr[j+1]) { //把大的数放在后面
 int temp = arr[j];
 arr[j]=arr[j+1]; 
 arr[j+1]=temp;
 }
 } 
 }
 }

(2)快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 public static void quickSort(int[] numbers,int low,int high){
 if(low < high) {
 int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二
 quickSort(numbers, low, middle-1); //对低字段表进行递归排序
 quickSort(numbers, middle+1, high); //对高字段表进行递归排序
 }
 
 }

(3)选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

 public static void selectSort(int[]a){
 int minIndex=0;
 int temp=0;
 
 for(int i=0;i<a.length-1;i++) {
 minIndex=i;//无序区的最小数据数组下标
 for(intj=i+1;j<a.length;j++) {
 //在无序区中找到最小数据并保存其数组下标
 if(a[j]<a[minIndex]) {
 minIndex=j;
 }
 }
 //将最小元素放到本次循环的前端
 temp=a[i];
 a[i]=a[minIndex];
 a[minIndex]=temp;
 }
 }

(4)插入排序

每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

每一个数和它前面的数依次进行比较,因为前面的数的顺序是已经排好的

 private static int[] insertSort(int[]arr){
 for(int i=1;i<arr.length;i++){
 for(int j=i;j>0;j--){
 if(arr[j]<arr[j-1]){
 int temp=arr[j];
 arr[j]=arr[j-1];
 arr[j-1]=temp;
 }else{
 break;
 }
 }
 }
 return arr;
 }

(5)希尔排序

把记录按下标的一定增量分组,对每组使用直接插入 排序算法 排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

 public static void main(String [] args)
 {
 int[]a={49,38,65,97,76,13,27,49,78,34,12,64,1};
 //希尔排序
 int d=a.length;
 while(true){
 d=d/2;
 for(int x=0;x<d;x++){
 for(int i=x+d;i<a.length;i=i+d){
 int temp=a[i];
 int j;
 for(j=i-d;j>=0&&a[j]>temp;j=j-d){
 a[j+d]=a[j];
 }
 a[j+d]=temp;
 }
 }
 if(d==10){
 break;
 }
 }
 }

(6)归并排序

建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。时间复杂度O(n log n) 。

 public static int[] sort(int[] nums, int low, int high) {
 int mid = (low + high) / 2;
 if (low < high) {
 // 左边
 sort(nums, low, mid);
 // 右边
 sort(nums, mid + 1, high);
 // 左右归并
 merge(nums, low, mid, high);
 }
 return nums;
 }

(6)堆排序

利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。(暂没理解)

4.递归、迭代

递归是自己调用自己,直到满足结束递归的条件时结束。迭代是不断的循环,直接循环结束。一般来说,能用迭代就不用递归,递归消耗资源大。

 递归
 int recursion(...){
 if(...) { //递归终止条件
 return abc(...); 
 }
 return 0;
 }
 
迭代
 int iteration(...){
 for(; ; ;) { //迭代终止条件
 a = b + c;
 } 
 }

5.位操作

位操作与逻辑运算符是2种不同的东西,初学之时,自己还经常记不清。位操作有6种,即与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)。在这些位操作运算符中,只有取反(~)是弹幕运算符,其他5种都是双目运算符。

6.概率

7.排列组合


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Applications (Hacking Exposed)

Web Applications (Hacking Exposed)

Joel Scambray、Mike Shema / McGraw-Hill Osborne Media / 2002-06-19 / USD 49.99

Get in-depth coverage of Web application platforms and their vulnerabilities, presented the same popular format as the international bestseller, Hacking Exposed. Covering hacking scenarios across diff......一起来看看 《Web Applications (Hacking Exposed)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具