`
seastar09
  • 浏览: 17237 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

java算法(转载)

阅读更多
package com.softeem.jbs.lesson4;



import java.util.Random;



/**

* 排序测试类

*

* 排序算法的分类如下:

* 1.插入排序(直接插入排序、折半插入排序、希尔排序);

* 2.交换排序(冒泡泡排序、快速排序);

* 3.选择排序(直接选择排序、堆排序);

* 4.归并排序;

* 5.基数排序。

*

* 关于排序方法的选择:

* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。

*  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。

* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;

* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

*

*/

public class SortTest {



       /**

        * 初始化测试数组的方法

        * @return 一个初始化好的数组

        */

       public int[] createArray() {

              Random random = new Random();

              int[] array = new int[10];

              for (int i = 0; i < 10; i++) {

                     array[i] = random.nextInt(100) - random.nextInt(100);//生成两个随机数相减,保证生成的数中有负数

              }

              System.out.println("==========原始序列==========");

              printArray(array);

              return array;

       }



       /**

        * 打印数组中的元素到控制台

        * @param source

        */

       public void printArray(int[] data) {

              for (int i : data) {

                     System.out.print(i + " ");

              }

              System.out.println();

       }



       /**

        * 交换数组中指定的两元素的位置

        * @param data

        * @param x

        * @param y

        */

       private void swap(int[] data, int x, int y) {

              int temp = data[x];

              data[x] = data[y];

              data[y] = temp;

       }



       /**

        * 冒泡排序----交换排序的一种

        * 方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。

        * 性能:比较次数O(n^2),n^2/2;交换次数O(n^2),n^2/4

        *

        * @param data 要排序的数组

        * @param sortType 排序类型

        * @return

        */

       public void bubbleSort(int[] data, String sortType) {

              if (sortType.equals("asc")) { //正排序,从小排到大

                     //比较的轮数

                     for (int i = 1; i < data.length; i++) {

                            //将相邻两个数进行比较,较大的数往后冒泡

                            for (int j = 0; j < data.length - i; j++) {

                                   if (data[j] > data[j + 1]) {

                                          //交换相邻两个数

                                          swap(data, j, j + 1);

                                   }

                            }

                     }

              } else if (sortType.equals("desc")) { //倒排序,从大排到小

                     //比较的轮数

                     for (int i = 1; i < data.length; i++) {

                            //将相邻两个数进行比较,较大的数往后冒泡

                            for (int j = 0; j < data.length - i; j++) {

                                   if (data[j] < data[j + 1]) {

                                          //交换相邻两个数

                                          swap(data, j, j + 1);

                                   }

                            }

                     }

              } else {

                     System.out.println("您输入的排序类型错误!");

              }

              printArray(data);//输出冒泡排序后的数组值

       }



       /**

        * 直接选择排序法----选择排序的一种

        * 方法:每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

        * 性能:比较次数O(n^2),n^2/2

        *       交换次数O(n),n

        *       交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CUP时间多,所以选择排序比冒泡排序快。

        *       但是N比较大时,比较所需的CPU时间占主要地位,所以这时的性能和冒泡排序差不太多,但毫无疑问肯定要快些。

        *

        * @param data 要排序的数组

        * @param sortType 排序类型

        * @return

        */

       public void selectSort(int[] data, String sortType) {



              if (sortType.equals("asc")) { //正排序,从小排到大

                     int index;

                     for (int i = 1; i < data.length; i++) {

                            index = 0;

                            for (int j = 1; j <= data.length - i; j++) {

                                   if (data[j] > data[index]) {

                                          index = j;



                                   }

                            }

                            //交换在位置data.length-i和index(最大值)两个数

                            swap(data, data.length - i, index);

                     }

              } else if (sortType.equals("desc")) { //倒排序,从大排到小

                     int index;

                     for (int i = 1; i < data.length; i++) {

                            index = 0;

                            for (int j = 1; j <= data.length - i; j++) {

                                   if (data[j] < data[index]) {

                                          index = j;



                                   }

                            }

                            //交换在位置data.length-i和index(最大值)两个数

                            swap(data, data.length - i, index);

                     }

              } else {

                     System.out.println("您输入的排序类型错误!");

              }

              printArray(data);//输出直接选择排序后的数组值

       }



       /**

        * 插入排序

        * 方法:将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表。

        * 性能:比较次数O(n^2),n^2/4

        *       复制次数O(n),n^2/4

        *       比较次数是前两者的一般,而复制所需的CPU时间较交换少,所以性能上比冒泡排序提高一倍多,而比选择排序也要快。

        *

        * @param data 要排序的数组

        * @param sortType 排序类型

        */

       public void insertSort(int[] data, String sortType) {

              if (sortType.equals("asc")) { //正排序,从小排到大

                     //比较的轮数

                     for (int i = 1; i < data.length; i++) {

                            //保证前i+1个数排好序

                            for (int j = 0; j < i; j++) {

                                   if (data[j] > data[i]) {

                                          //交换在位置j和i两个数

                                          swap(data, i, j);

                                   }

                            }

                     }

              } else if (sortType.equals("desc")) { //倒排序,从大排到小

                     //比较的轮数

                     for (int i = 1; i < data.length; i++) {

                            //保证前i+1个数排好序

                            for (int j = 0; j < i; j++) {

                                   if (data[j] < data[i]) {

                                          //交换在位置j和i两个数

                                          swap(data, i, j);

                                   }

                            }

                     }

              } else {

                     System.out.println("您输入的排序类型错误!");

              }

              printArray(data);//输出插入排序后的数组值

       }



       /**

        * 反转数组的方法

        * @param data 源数组

        */

       public void reverse(int[] data) {



              int length = data.length;

              int temp = 0;//临时变量



              for (int i = 0; i < length / 2; i++) {

                     temp = data[i];

                     data[i] = data[length - 1 - i];

                     data[length - 1 - i] = temp;

              }

              printArray(data);//输出到转后数组的值

       }



       /**

        * 快速排序

        * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

        * 步骤为:

        * 1. 从数列中挑出一个元素,称为 "基准"(pivot),

        * 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。

        * 3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

        * 递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

        * @param data 待排序的数组

        * @param low

        * @param high

        * @see SortTest#qsort(int[], int, int)

        * @see SortTest#qsort_desc(int[], int, int)

        */

       public void quickSort(int[] data, String sortType) {

              if (sortType.equals("asc")) { //正排序,从小排到大

                     qsort_asc(data, 0, data.length - 1);

              } else if (sortType.equals("desc")) { //倒排序,从大排到小

                     qsort_desc(data, 0, data.length - 1);

              } else {

                     System.out.println("您输入的排序类型错误!");

              }

       }



       /**

        * 快速排序的具体实现,排正序

        * @param data

        * @param low

        * @param high

        */

       private void qsort_asc(int data[], int low, int high) {

              int i, j, x;

              if (low < high) { //这个条件用来结束递归

                     i = low;

                     j = high;

                     x = data[i];

                     while (i < j) {

                            while (i < j && data[j] > x) {

                                   j--; //从右向左找第一个小于x的数

                            }

                            if (i < j) {

                                   data[i] = data[j];

                                   i++;

                            }

                            while (i < j && data[i] < x) {

                                   i++; //从左向右找第一个大于x的数

                            }

                            if (i < j) {

                                   data[j] = data[i];

                                   j--;

                            }

                     }

                     data[i] = x;

                     qsort_asc(data, low, i - 1);

                     qsort_asc(data, i + 1, high);

              }

       }



       /**

        * 快速排序的具体实现,排倒序

        * @param data

        * @param low

        * @param high

        */

       private void qsort_desc(int data[], int low, int high) {

              int i, j, x;

              if (low < high) { //这个条件用来结束递归

                     i = low;

                     j = high;

                     x = data[i];

                     while (i < j) {

                            while (i < j && data[j] < x) {

                                   j--; //从右向左找第一个小于x的数

                            }

                            if (i < j) {

                                   data[i] = data[j];

                                   i++;

                            }

                            while (i < j && data[i] > x) {

                                   i++; //从左向右找第一个大于x的数

                            }

                            if (i < j) {

                                   data[j] = data[i];

                                   j--;

                            }

                     }

                     data[i] = x;

                     qsort_desc(data, low, i - 1);

                     qsort_desc(data, i + 1, high);

              }

       }



       /**

        *二分查找特定整数在整型数组中的位置(递归)

        *查找线性表必须是有序列表

        *@paramdataset

        *@paramdata

        *@parambeginIndex

        *@paramendIndex

        *@returnindex

        */

       public int binarySearch(int[] dataset, int data, int beginIndex,

                     int endIndex) {

              int midIndex = (beginIndex + endIndex) >>> 1; //相当于mid = (low + high) / 2,但是效率会高些

              if (data < dataset[beginIndex] || data > dataset[endIndex]

                            || beginIndex > endIndex)

                     return -1;

              if (data < dataset[midIndex]) {

                     return binarySearch(dataset, data, beginIndex, midIndex - 1);

              } else if (data > dataset[midIndex]) {

                     return binarySearch(dataset, data, midIndex + 1, endIndex);

              } else {

                     return midIndex;

              }

       }



       /**

        *二分查找特定整数在整型数组中的位置(非递归)

        *查找线性表必须是有序列表

        *@paramdataset

        *@paramdata

        *@returnindex

        */

       public int binarySearch(int[] dataset, int data) {

              int beginIndex = 0;

              int endIndex = dataset.length - 1;

              int midIndex = -1;

              if (data < dataset[beginIndex] || data > dataset[endIndex]

                            || beginIndex > endIndex)

                     return -1;

              while (beginIndex <= endIndex) {

                     midIndex = (beginIndex + endIndex) >>> 1; //相当于midIndex = (beginIndex + endIndex) / 2,但是效率会高些

                     if (data < dataset[midIndex]) {

                            endIndex = midIndex - 1;

                     } else if (data > dataset[midIndex]) {

                            beginIndex = midIndex + 1;

                     } else {

                            return midIndex;

                     }

              }

              return -1;

       }



       public static void main(String[] args) {

              SortTest sortTest = new SortTest();



              int[] array = sortTest.createArray();



              System.out.println("==========冒泡排序后(正序)==========");

              sortTest.bubbleSort(array, "asc");

              System.out.println("==========冒泡排序后(倒序)==========");

              sortTest.bubbleSort(array, "desc");



              array = sortTest.createArray();



              System.out.println("==========倒转数组后==========");

              sortTest.reverse(array);



              array = sortTest.createArray();



              System.out.println("==========选择排序后(正序)==========");

              sortTest.selectSort(array, "asc");

              System.out.println("==========选择排序后(倒序)==========");

              sortTest.selectSort(array, "desc");



              array = sortTest.createArray();



              System.out.println("==========插入排序后(正序)==========");

              sortTest.insertSort(array, "asc");

              System.out.println("==========插入排序后(倒序)==========");

              sortTest.insertSort(array, "desc");



              array = sortTest.createArray();

              System.out.println("==========快速排序后(正序)==========");

              sortTest.quickSort(array, "asc");

              sortTest.printArray(array);

              System.out.println("==========快速排序后(倒序)==========");

              sortTest.quickSort(array, "desc");

              sortTest.printArray(array);



              System.out.println("==========数组二分查找==========");

              System.out.println("您要找的数在第" + sortTest.binarySearch(array, 74)

                            + "个位子。(下标从0计算)");

       }

}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/rommal7090/archive/2009/04/30/4138914.aspx
分享到:
评论

相关推荐

    Java算法演示程序_动画方式_带当前代码显示

    很早以前写的算法演示程序,用动画的方式演示顺序查找、二分查找、冒泡、快速排序、选择排序等算法。 可以显示当前的算法代码以及当前正在执行的语句,并可...放到要发霉了,拿出来给大家看看,如有转载,请注明出处 :)

    RSA算法描述和代码(转载)

    根据提供的文件内容,本文将详细解析RSA算法的基本概念、工作原理及其实现步骤,并通过具体的Java代码示例来展示如何实现这一加密算法。 ### RSA算法概述 RSA算法是一种非对称加密技术,由Ron Rivest、Adi Shamir ...

    Java-贪吃蛇AI-课程设计(源码+文档)

    地图管理:添加、修改、编辑、删除地图 游戏相关:选关卡、操作蛇、AI电脑蛇、粒子特效、音效 ...版权声明:本文为CSDN博主「刘建杰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    矢量寻路算法源码

    矢量寻路源码由 翼尘 Leo泥偶原创 如需转载请声明出处 原创矢量寻路算法,可以用于各种游戏的自动寻路系统,改进之后还可以有其他用途,核心代码在Role类中,具体实现请访问: ...

    计算船舶排放java代码

    个人创作,转载需说明,用于计算区域内某一时间段船舶排放。

    java笔试题算法-JavaEdge:JavaEdge

    java笔试题算法 目录 :envelope: 说明 项目介绍 该文档主要是笔主在学习 Java 的过程中的一些学习笔记,但是为了能够涉及到大部分后端学习所需的技术知识点我也会偶尔引用一些别人的优秀文章的链接。文档大部分内容...

    骆昊JAVA面试题全集2018博客文章整理

    骆昊还增加了数据结构、算法、大型网站架构、设计模式、UML、Spring MVC等主题的深度解析,特别关注了如hashCode方法设计、垃圾收集、并发编程和数据库事务等关键知识点。 文章在CSDN上的访问量超过5万次,并被多个...

    DES-java.rar_DES JAVA_DES algorithm_DES 加密_des

    利用Java对DES算法的加密和解密,需要的转载!

    java商品购物系统

    同时修正多出BUG,更改某些算法,提高管理效率。 3.运用了XML应用,国际化,鼠标点击事件,系统托盘图标,中国大陆身份证验证算法(18位)等等。 注:国际化未完全,若你有兴趣可更改源码 &lt;br&gt;购物流程: 管理...

    Java面试资料大集合

    通过阅读《Java常见面试题.doc》、《Java面试题1.htm》、《5559.htm》、《Java面试题2.htm》、《java面试笔试题大汇总 及c-c++面试试题(转载 ) - happyfish - BlogJava.mht》以及《Java常见面试题.txt》等文件,您...

    java源码编辑-drools:Drools是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声

    java 源码编辑 虫洞 · 技术栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 作者: 小傅哥,Java Developer, 本文档是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个较清晰详细...

    IBE-master

    标题中的"IBE-master"指的是基于身份的加密(Identity-Based Encryption, IBE)的主项目,这是一个专注于加密解密算法的Java实现。IBE是一种公钥加密技术,它允许使用接收者的身份(例如电子邮件地址或用户名)作为...

    java8源码-JavaInterview:Java面试

    java8 源码 目录(ctrl + f 查找更香) 项目准备 面试知识点 公司面经 Java 基础 容器(包括juc) 并发 JVM Java8 计算机网络 计算机操作系统 Linux 数据结构与算法 数据结构 算法 数据库 MySQL mysql(优化思路) ...

    java源码分析工具-Java-Learn:Java学习笔记-java学习笔记,包括JVM,并发,JDK一些工具的源码,各种书籍,spring

    java 源码分析 工具 声明 关于仓库 本仓库是笔者在学习过程中的知识总结,内容以Java后端的知识总结为主。 【个人博客】 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ ...算法 ...Java ...算法 ...Java ...《转载说明》 向优秀的大佬们致敬

    JavaCore:Java程序员所需要掌握的核心知识

    微信公众号目录算法Java虚拟机春天SpringMVC高并发架构基石-缓存网络篇架构其他主意书单《 Java编程思想(第4版)》-Java领域的圣经,建议稍微有点基础后阅读。不推荐初学者阅读,小心被劝退《深入理解Java虚拟机》-...

    数据挖掘贝叶斯——一种实现

    数据挖掘贝叶斯算法Java实现 数据挖掘贝叶斯是一种实现贝叶斯数据分类的算法,该算法使用Java语言实现,主要用于小规模数据集的实验和测试,不适合用于工程应用。该算法假定训练数据各属性列的值均是离散类型的,...

    Java-Tutorial:【Java工程师面试复习指南】本仓库涵盖大部分Java程序员所需要掌握的核心知识,整合了互联网上的很多优质Java技术文章,力求打造为最完整最实用的Java开发者学习指南,如果对你有帮助,给个star告诉我吧,谢谢!

    本仓库为【Java工程师技术指南】力求打造最完整最实用的Java工程师学习指南!这些文章和总结都是我近几年学习Java总结和...目录计算机网络操作系统Linux相关数据结构与算法数据结构算法数据库MySQL缓存Redis消息队列K

    leetcode下载-LeetCode-Java:LeetCode-Java

    leetcode下载 LeetCode ...1.所有代码均为原创,可随意转载、使用、修改; 2.代码以简洁明了为原则,逻辑清晰; 3.欢迎大家随时交流,给予意见和建议; 菜鸟作者希望和大家一起进步! 加油!加油!加油!

    java8源码-JavaGuide:指南

    java8 源码 :thumbs_up:推荐 (Github 访问速度比较慢可能会导致部分图片无法刷新出来) :thumbs_up:推荐 书单已经被移动到 这个仓库。 介绍:关于 JavaGuide 的相关介绍请看: 。 PDF版本 : 。。 知识星球 : 简历...

Global site tag (gtag.js) - Google Analytics