排序算法

排序算法中包括:简单排序、高级排序

简单排序

简单排序常用的有:冒泡排序、选择排序、插入排序

  • 冒泡排序代码如下:
 private static void bubbleSrot(int[] arr) {

 for (int i = 0; i < arr.length - 1; i++) {

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

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

 int temp = arr[i];

 arr[i] = arr[j];

 arr[j] = temp;

 }

 }

 }

 }

  冒泡排序方法速度是很慢的,运行时间为O(N²)级。选择排序改进了冒泡排序,将必要的交换次数从O(N²)减少到O(N),不幸的是比较次数依然是O(N²)级。然而,选择排序依然为大记录量的排序提出了一个非常重要的改进,因为这些大量的记录需要在内存中移动,这就使交换的时间和比较的时间相比起来,交换的时间更为重要。
---------------------

  • 选择排序代码如下:
 private static void chooseSort(int[] arr) {

 for (int i = 0; i < arr.length; i++) {

 int least = i;

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

 if (arr[j] < arr[least]) {

 least = j;

 }

 }

 // 将当前第一个元素与它后面序列中的最小的一个 元素交换,也就是将最小的元素放在最前端

 int temp = arr[i];

 arr[i] = arr[least];

 arr[least] = temp;

 }

 }

  选择排序的效率:选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2。对于10个数据项,需要45次比较,然而,10个数据项只需要少于10次的交换。对于100个数据项,需要4950次比较,但只进行不到100次交换。N值很大时,比较的次数是主要的,所以结论是选择排序和冒泡哦排序一样运行了O(N²)时间。但是,选择排序无疑更快,因为它进行的交换少得多。
---------------------

  • 插入排序代码如下:
 private static void insertionSort(int[] arr) {

 int in, out;

 for (out = 1; out < arr.length; out++) {

 int temp = arr[out];

 in = out;

 while (in > 0 && arr[in - 1] >= temp) {

 arr[in] = arr[in - 1];

 --in;

 }

 arr[in] = temp;

 }

 }

  插入排序的效率:这个算法中,第一趟排序,最多比较一次,第二趟排序,最多比较两次,以此类推,最后一趟最多比较N-1次,因此有1+2+3+…+N-1 = N*(N-1)/2。然而,因为在每一趟排序发现插入点之前,平均只有全体数据项的一半真的进行了比较,所以除以2最后是N*(N-1)/4。
对于随机顺序的数据,插入排序也需要O(N²)的时间级。当数据基本有序,插入排序几乎只需要O(N)的时间,这对把一个基本有序的文件进行排序是一个简单而有效的方法。
  对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不比冒泡排序快。
---------------------

  • 归并排序

 // 将两个已排序的数组合并到第三个数组上。

 private static void merge(int[] arrA, int[] arrB, int[] arrC) {

 int aDex = 0, bDex = 0, cDex = 0;

 int sizeA = arrA.length;

 int sizeB = arrB.length;

 // A数组和B数组都不为空

 while (aDex < sizeA && bDex < sizeB) {

 if (arrA[aDex] < arrB[bDex]) {

 arrC[cDex++] = arrA[aDex++];

 } else {

 arrC[cDex++] = arrB[bDex++];

 }

 }

 // A数组不为空,B数组为空

 while (aDex < sizeA) {

 arrC[cDex++] = arrA[aDex++];

 }

 // A数组为空,B数组不为空

 while (bDex < sizeB) {

 arrC[cDex++] = arrB[bDex++];

 }

 }

高级排序

  常见的高级排序:哈希排序、快速排序,这两种排序算法都比简单排序算法快得多:希尔排序大约需要O(N*(logN)²)时间,快速排序需要O(N*logN)时间。这两种排序算法都和归并排序不同,不需要大量的辅助存储空间。希尔排序几乎和归并排序一样容易实现,而快速排序是所有通用排序算法中最快的一种排序算法。 还有一种基数排序,是一种不常用但很有趣的排序算法。

  • 哈希排序

  哈希排序是基于插入排序的,实现代码如下:

 private static void shellSort(int[] arr) {

 int inner, outer;

 int temp;

 int h = 1;

 int nElem = arr.length;

 while (h <= nElem / 3) {

 h = h * 3 + 1;

 }

 while (h > 0) {

 for (outer = h; outer < nElem; outer++) {

 temp = arr[outer];

 inner = outer;

 while (inner > h - 1 && arr[inner - h] >= temp) {

 arr[inner] = arr[inner - h];

 inner -= h;

 }

 arr[inner] = temp;

 }

 h = (h - 1) / 3;

 }

 }
---------------------
  • 快速排序

  快速排序是最流行的排序算法,在大多数情况下,快速排序都是最快的,执行时间是O(N*logN)级,划分是快速排序的根本机制。划分本身也是一个有用的操作。 划分数据就是把数据分为两组,使所有关键字大于特定值的数据项在一组,所有关键字小于特定值的数据项在另一组。代码实现如下:

 // 快速排序

 private static void recQuickSort(int arr[], int left, int right) {

 if (right - left <= 0) {

 return;

 } else {

 int pivot = arr[right];// 一般使用数组最右边的元素作为枢纽

 int partition = partitionIt(arr, left, right, pivot);

 recQuickSort(arr, left, partition - 1);

 recQuickSort(arr, partition + 1, right);

 }

 }

 // 划分

 private static int partitionIt(int[] arr, int left, int right, int pivot) {

 int leftPtr = left - 1;

 // int rightPtr = right + 1;

 int rightPtr = right; // 使用最右边的元素作为枢纽,划分时就要将最右端的数据项排除在外

 while (true) {

 while (arr[++leftPtr] < pivot)

 ;

 while (rightPtr > 0 && arr[--rightPtr] > pivot)

 ;

 if (leftPtr >= rightPtr) {

 break;

 } else {

 // 交换leftPtr和rightPtr位置的元素

 int temp = arr[leftPtr];

 arr[leftPtr] = arr[rightPtr];

 arr[rightPtr] = temp;

 }

 }

 // 交换leftPtr和right位置的元素

 int temp = arr[leftPtr];

 arr[leftPtr] = arr[right];

 arr[right] = temp;

 return leftPtr;// 返回枢纽位置

 }
---------------------

查找算法

对于有序的数组,常用的查找算法:二分查找。代码如下:

 private static int find(int [] arr,int searchKey){

         int lowerBound = 0;

         int upperBound = arr.length -1;

         int curIn;

         while(lowerBound <= upperBound){

             curIn = (lowerBound + upperBound) / 2;

             if(arr[curIn] == searchKey){

                 return curIn;

             }else{

                 if(arr[curIn] < searchKey){

                     lowerBound = curIn + 1;

                 }else{

                     upperBound = curIn - 1;

                 }

             }

         }

         return -1;

     }
---------------------

java开发过程中几种常用算法的更多相关文章

  1. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  2. 【Java基础】Java开发过程中的常用工具类库

    目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...

  3. javascript中数组的常用算法深入分析

    Array数组是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array是前端必修的功课.本文将给大家详细介绍了javascri ...

  4. Java集合中迭代器的常用用法

    该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...

  5. android(java) 开发过程中经验及总结记录

    android(java) 开发过程中经验及总结记录

  6. Java开发中的eclispe常用快捷键&全部快捷键

    Java开发中的eclispe常用快捷键&全部快捷键 Ctrl+1 快速修复(经典快捷键)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ ...

  7. java 中几种常用数据结构

    Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类. 一.几个常用类的区别 1.A ...

  8. 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的. 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排 ...

  9. java面向对象中的String类中12种常用的方法

    1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...

随机推荐

  1. 手机号获取省份,城市api的使用

    function get_mobile_area($mobile){ header('Content-Type:text/html;charset=gbk'); $url = 'http://life ...

  2. POJ 1328 Radar Installation 【贪心 区间选点】

    解题思路:给出n个岛屿,n个岛屿的坐标分别为(a1,b1),(a2,b2)-----(an,bn),雷达的覆盖半径为r 求所有的岛屿都被覆盖所需要的最少的雷达数目. 首先将岛屿坐标进行处理,因为雷达的 ...

  3. ABBYY FineReader双十一优惠享不停,战绩如何?

    随着双十一的火热来袭,购物达人也是不吝啬囊中票子,各种姿势剁手齐全,立誓过后吃土半月,双十一的好与不好?自己也是门清,反正真真的是促进消费了! 就ABBYYFineReader而言,此次的双十一力度就 ...

  4. Python——wordcloud

    import jiebafrom wordcloud import WordCloud,STOPWORDSimport matplotlib.pyplot as pltfrom scipy.misc ...

  5. Facebook再次爆出安全漏洞,9000万用户受影响

    今年上半年开始,美国社交媒体Facebook因数据泄露事件和涉嫌操纵选举等问题频繁接受听证会拷问,然而事情却远没有结束.今年9月Facebook再次爆出安全漏洞,导致9000万用户可能受到影响. 根据 ...

  6. 在用HTML+css写页面中遇到的问题

    一.清除浮动. (1)verflow:hidden;这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很 了解.一提到清除浮动,我们就会 ...

  7. centos 7 防火墙配置

    centos 7里的防火墙使用的是firewall. 之前问过一个运维大牛,selinux的位置有点尴尬,说他们在工作中一般都会在第一时间关闭掉.我记得当时自己假设网站的时候就被这个坑了大半晚上.这个 ...

  8. [caffe]网络各层参数设置

    数据层 数据层是模型最底层,提供提供数据输入和数据从Blobs转换成别的格式进行保存输出,通常数据预处理(减去均值,放大缩小,裁剪和镜像等)也在这一层设置参数实现. 参数设置: name: 名称 ty ...

  9. Crontab入门基础

    Crontab入门基础 crontab前言 crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那 ...

  10. Redis:基础知识及其常用数据类型和关键字

    Redis: Redis是什么: REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value)分布式内存数 ...