`
开心的笔记
  • 浏览: 4491 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

初识java算法

阅读更多

引言:这是我对常用算法的初步理解,如有不足敬请指正,谢谢!

1.【选择排序法】
 初始数组   【63 4  24 1  3  15  】
 第一次排序 【4  24 1  3  15 】  63
 第二次排序 【4  1  3  15 】 24  63
 第三次排序 【4  1  3  】 15 24  63
 第四次排序 【1  3  】 4  15 24  63
 第五次排序 【1  】 3  4  15 24  63
 特点:每一次从待排序的数据中选出最小(或最大)的一个元素,顺序放到已经排好序的数列最后,直达全部排完!
 使用:如果数组有重复值,可选择该排序方法,因为遇到重复相等的值不会做任何处理,如果程序允许重复,该方法数据交换次数少,效率高!
   程序:
   private int[] array = new int[10];
   protected void do_button_actionPerformed() {
        // 创建随机数对象
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
        // 初始化数组元素,生成50以内的随机数
        array[i] = random.nextInt(50);   
        }
   }
   //核心算法  
   protected void do_button_1_actionPerformed() {
        int index;
        for (int i = 1; i < array.length; i++) {
            index = 0;
            for (int j = 1; j <= array.length - i; j++) {
                if (array[j] > array[index]) {
                    index = j;// 查找最大值
                }
            }
            // 交换在位置array.length-i和index(最大值)两个数
            int temp = array[array.length - i];
            array[array.length - i] = array[index];
            array[index] = temp;
         }
   }


2.【冒泡排序】
定义:基本思想是对比相邻的元素值,如果满足条件就交换元素,把较小的移动到前面,这样数组就像气泡一样从底部上升到顶部。
特点:比较的次数依排序轮数递减,因为每次都会确定一个最大值!
  程序:
  private int[] array = new int[10];  
  protected void do_button_actionPerformed(ActionEvent e) {
      Random random = new Random();
      for (int i = 0; i < array.length; i++) {
           array[i] = random.nextInt(50);
      }
  } 
  //核心算法  
  protected void do_button_1_actionPerformed(ActionEvent e) {
      for (int i = 1; i < array.length; i++) { // 长度为N的数组,循环轮数N-1,每次找出一个最大值
         // 比较相邻两个元素,较大的数往后冒泡
         for (int j = 0; j < array.length - i; j++) {
             if (array[j] > array[j + 1]) {
                  int temp = array[j];// 把第一个元素值保持到临时变量中
                  array[j] = array[j + 1];// 把第二个元素值保存到第一个元素单元中
                  array[j + 1] = temp;// 把临时变量也就是第一个元素原值保持到第二个元素中
              }    
            }
        }


3.【快速排序】
定义:对冒泡排序的一种改进,基本思想,通过一趟排序把要排序的数据分成2部分,其中一部分比参考数(通常选取每个部分的第1个数)小的,另一部分都是比参考数大的,对每个部分进行递归处理,直到每个部分只有一个元素即完成排序.
例子:
          初始数组:  49  38  65  97  76  13  27  49
        第一次排序: {27  38  13} 49{76 97 65 49}
    对左边序列排序: {13}27{38} 49{76 97 65 49}
        对右边排序:                {65 49}76{97}
    对右边继续排序:                {49}65
    完成排序的序列: {13}27{38}49 49}65 76{97}
核心算法:
    private int[] array = new int[10];
    protected void do_button_actionPerformed(ActionEvent e) {
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(90);        
        }  
    } 
    //调用快速排序的方法,传入初始参数
    protected void do_button_1_actionPerformed(ActionEvent e) {
        quickSort(array, 0, array.length - 1);
    }
    //快速排序的逻辑排序相对复杂一些
    private void quickSort(int sortarray[], int lowIndex, int highIndex) {
        int lo = lowIndex;// 记录最小索引
        int hi = highIndex;// 记录最大索引
        int mid;// 记录分界点元素
        if (highIndex > lowIndex) {
            // 确定中间分界点元素值,sortarray[]数组
            mid = sortarray[(lowIndex + highIndex) / 2];
            while (lo <= hi) {
                while ((lo < highIndex) && (sortarray[lo] < mid))
                    ++lo;// 确定不大于分界元素值的最小索引
                while ((hi > lowIndex) && (sortarray[hi] > mid))
                    --hi;// 确定大于分界元素值的最大索引
                if (lo <= hi) {// 如果最小与最大索引没有重叠
                    swap(sortarray, lo, hi);// 交换两个索引的元素
                    ++lo;// 递增最小索引
                    --hi;// 递减最大索引
                }
            }
            if (lowIndex < hi)// 递归排序没有未分解元素
                quickSort(sortarray, lowIndex, hi);
            if (lo < highIndex)// 递归排序没有未分解元素
                quickSort(sortarray, lo, highIndex);
        }
    }  
    private void swap(int swapArray[], int i, int j) {
        // 交换数组元素
        int temp = swapArray[i];
        swapArray[i] = swapArray[j];
        swapArray[j] = temp;
    }
   
4.【直接插入排序】
定义: 将一个记录插入到有序数列中,使得到的新数列依然有序,插入一个新的元素会使得元素后面的数字向后移动一位.
      例子:2,8,7,5,9,6
      获取第一个元素:     2{ 8,7,5,9,6}
      依次插入后面的元素: 2,8{ 7,5,9,6}  
      依次插入后面的元素: 2,7,8{ 5,9,6}  
      依次插入后面的元素: 2,5,7,8{ 9,6}  
      依次插入后面的元素: 2,5,7,8 ,9{6}
      依次插入后面的元素: 2,5,6,7,8 ,9
核心算法:
    private int[] array = new int[10];   
    protected void do_button_actionPerformed(ActionEvent e) {
        Random random = new Random();
        for (int i = 0; i < array.length; i++) {
           array[i] = random.nextInt(90);
        }
    }
    protected void do_button_1_actionPerformed(ActionEvent e) {
        int tmp;// 定义临时变量
        int j;
        for (int i = 1; i < array.length; i++) {
           tmp = array[i];// 保存临时变量
           for (j = i - 1; j >= 0 && array[j] > tmp; j--) {
              array[j + 1] = array[j];// 数组元素交换
          }
           array[j + 1] = tmp;// 在排序位置插入数据
     }
  }

 

分享到:
评论

相关推荐

    决战JAVA大后端-解决JavaWeb后端疑难杂症 JAVA后端高级开发技术专题课程 大牛亲授

    初识java;目录中文件数:6个 ├─class001.rar ├─eclipse-jee-photon-R-win32-x86_64.zip ├─jdk-8u121-windows-i586.exe ├─jdk-8u121-windows-x64.exe ├─数据类型和运算符.ppt ├─笔记.docx (2)\10.实用类 ...

    java文章合集2

    初识Java 9模块化编程.pdf 区块链难理解?200行代码教你写一个自己的区块链!.pdf 十个问答助你了解 Redis 高可用架构及 Redis 运维.pdf 后Kubernetes时代,带你系统梳理K8S 12大关键特性.pdf 容器如“衣服”,而...

    Java思维导图xmind文件+导出图片

    初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么...

    微信公众号

    微信开发基本流程实现,基于java,实现对接,自定义菜单,...里面有很多的代码demo一本书:微信公众平台应用开发 (豆瓣)一系列视频:初识Java微信公众号开发;Java微信公众号开发进阶GitHub有很多开源的代码可以学习。

    初识大数据(五.大数据平台基本架构).pdf

    初识⼤数据(五 初识⼤数据(五.⼤数据平台基本架构) ⼤数据平台基本架构) ⼤数据开发,并不仅仅只是⼀两个组件的简单堆砌,⽽是需要按照实际的数据量、数据种类以及实际业务的需要进⾏⼤量的调优和⼆次 开发,...

    data_mining:一些数据挖掘算法的实现

    数据挖掘一些数据挖掘算法的实现

    班级布置学习C#课程的第一天

    一、初识C#程序 1、算法和流程图 了解算法的基本组成以及算法的概念:用更的成本去解决需求; 流程图:就是一个开始到结束的过程,中间有很多的分之; 2、简介以及开发环境 第一个C#语言的设计的名字COOL 2000.2...

    JAVA程序开发大全---上半部分

    第1章 初识MyEclipse 1 1.1 MyEclipse简介 1 1.2 MyEclipse的安装 1 1.2.1 JDK的安装与配置 1 1.2.2 MyEclipse 7.0的安装和运行 4 1.3 获取和阅读MyEclipse帮助文档 5 1.4 本章小结 5 第2章 MyEclipse集成开发环境的...

    深入JVM内核 - 原理、诊断与优化

    初识JVM JVM分类 Java语言规范 JVM规范 介绍JVM的基本知识和发展历史,并介绍了Java语言规范和JVM规范。 第二课 JVM运行机制简介 堆、栈、方法区等 JVM启动流程 内存模型和volatile实例 解释和编译运行的概念 介绍...

    深入JVM内核—原理、诊断与优化

    1.初识JVM.mp4 2.JVM运行机制.mp4 3.常用JVM配置参数.mp4 4.GC算法与种类.mp4 5.GC参数.mp4 6.类装载器.mp4 7.性能监控工具.mp4 8.Java堆分析.mp4......

    深入JVM内核—原理、诊断与优化 共11章ppt

    1..初识JVM。2.JVM运行机制。3.常用JVM配置参数。4.GC算法与种类。5.GC参数。6.类装载器。8.Java堆分析。9.锁。10.Class文件结构。11.字节码执行。

    嵌入式设计及linux驱动开发指南——基于ARM9处理器.pdf

    6.5.18 和加密算法相关的选项 6.5.19 库选项 6.5.20 保存内核配置 第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备...

    nosql 入门教程

    2.2.2 初识Thrift 33 2.3 小结 34 第3章 NoSQL接口与交互 36 3.1 没了SQL还剩什么 36 3.1.1 存储和访问数据 37 3.1.2 MongoDB数据存储与访问 37 3.1.3 MongoDB数据查询 41 3.1.4 Redis数据存储与访问 43 ...

    Hadoop实战中文版

    《Hadoop实战》作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,在由大量计算机组成的集群中运行海量数据的分布式计算,是谷歌实现云计算的重要基石。《Hadoop实战》分为3个部分,深入浅出地...

    flink-shaded-hadoop-2-uber-3.0.0-cdh6.2.0-7.0.jar(jar包).rar

    Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。...

    Struts2 in action中文版

    第2章 初识Struts 2 16 2.1 声明性架构 16 2.1.1 两种配置 16 2.1.2 声明架构的两种方式 17 2.1.3 智能默认值 20 2.2 简单的HelloWorld示例 20 2.2.1 部署示例应用程序 20 2.2.2 探索HelloWorld应用程序 24 2.3 使用...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    3.2.4 Memcached的分布式算法 3.3 Memcached的管理与性能监控 3.3.1 如何管理Memcached 3.3.2 Memcached的监控 3.3.3 Memcached变种产品介绍 3.4 通过UDFs实现Memcached与MySQL的自动更新 3.4.1 UDFs...

    Hadoop实战中文版.PDF

    出版信息编辑译者:韩冀中出版社:人民邮电出版社出版时间:2011年10月版次:1.1开本:16开装帧:平装字数:417千字页数:253页内容简介编辑作为云计算所青睐的分布式架构,Hadoop是一个用Java语言实现的软件框架,...

Global site tag (gtag.js) - Google Analytics