Java冒泡法和二分法

最近去一家公司面试,手贱在人家CTO面前自告奋勇写了一把冒泡法,结果在交换数据的时候出了洋相,回家反思,写下如下代码,对自己算是一个鞭策,得到的教训是不要眼高手低,低调前行。

 1 package com.defymedia.interview.sort;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Random;
 6
 7 public class SimpleSort {
 8
 9     public static final int NO_MATCH = -1;
10
11     public <T extends Comparable> List<T> sort(List<T> list) {
12         int size = list != null ? list.size() : 0;
13         if (size == 0) return null;
14
15         for (int i = 0; i < size; i++) {
16             for (int j = i + 1; j < size; j++) {
17                 if (list.get(i).compareTo(list.get(j)) > 0) {
18                     T temp = list.get(i);
19                     list.set(i, list.get(j));
20                     list.set(j, temp);
21                 }
22             }
23         }
24
25         return list;
26     }
27
28     public <T extends Comparable> T[] sort(T[] ts) {
29         int size = ts != null ? ts.length : 0;
30         if (size == 0) return null;
31
32         for (int i = 0; i < size; i++) {
33             for (int j = i + 1; j < size; j++) {
34                 if (ts[i].compareTo(ts[j]) > 0) {
35                     T temp = ts[i];
36                     ts[i] = ts[j];
37                     ts[j] = temp;
38                 }
39             }
40         }
41
42         return ts;
43     }
44
45     public <T extends Comparable> int binarySearch(T[] ts, T t) {
46         int length = ts != null ? ts.length : NO_MATCH;
47         if (length <= 0 || t == null) return NO_MATCH;
48
49         int middle;
50         int index = NO_MATCH;
51         int low = 0;
52         int high = length;
53         while (low < high) {
54             middle = (low + high) >> 1;
55             T temp = ts[middle];
56             if (temp.compareTo(t) > 0) {
57                 high = middle;
58             } else if (temp.compareTo(t) < 0) {
59                 low = middle;
60             } else {
61                 index = middle;
62                 break;
63             }
64         }
65
66         System.out.println("index is " + index);
67         return index;
68     }
69
70     public static void main(String[] param) {
71         SimpleSort simpleSort = new SimpleSort();
72         int size = 10;
73         Random random = new Random();
74         List<Integer> list = new ArrayList<>(size);
75         for (int i = 0; i < size; i++) {
76             list.add(random.nextInt(20));
77         }
78         list = simpleSort.sort(list);
79         for (Comparable comparable : list) {
80             System.out.println(comparable.toString());
81         }
82         Integer[] data = new Integer[size];
83         for (int i = 0; i < size; i++) {
84             data[i] = random.nextInt(50);
85         }
86         data = simpleSort.sort(data);
87         for (Comparable comparable : data) {
88             System.out.println(comparable.toString());
89         }
90         int number = NO_MATCH;
91         simpleSort.binarySearch(data, number);
92     }
93 }
时间: 2024-10-11 22:54:38

Java冒泡法和二分法的相关文章

python的冒泡法和二分法的总结

一:二分法 首先介绍二分法 二分法查找,每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序的序列才可以使用二分法查找 要求:查找的序列必须是有序序列 --------------------------------------------------------------------------------------------------------------------------------------------------------- 下面是一个二分法的例

JAVA中方法和变量在继承中的覆盖和隐藏

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题. 隐藏 :child隐藏了parent的变量和方法,那么,child不能访问parent被隐藏的变量或者方法,但是,讲B转换成A中,可以访问A被隐藏的变量或者方法 覆盖 :child覆盖了parent的变量或者方法,那么,child不能访问parent被覆盖的变量或者方法,将child转换成parent后同样不能访问par

JAVA中方法和变量在继承中的覆盖和隐藏(一)

我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊,但是在面试或者是SCJP认证题中围绕这些是会经常碰到的,所以这里来讨论下 首先我们来看几个概念 类变量:又叫静态变量,这种变量属于类,通过类名就可以访问类变量. 实例变量:属于类的实例,即对象,通过对象可以访问实例变量,但是不能通过类名访问实例变量. 静态方法:通过类名访问. 实例方法:对象访问,

Java中的二分法查找算法

[ 什么是二分查找 ]  二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象, 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.以此类推不断缩小搜索范围. [ 二分查找的条件 ] 二分查找的先决条件是查找的数列必须是有序的. [ 二分查找的优缺点 ] 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查数列为有序,且插入删除困难: 适用场景:不经常变动而查找频繁的有序列表. [ 算法步骤描述 ] ①

算法(1)——Java冒泡算法

Java冒泡算法算是最常见的算法之一了.那么什么是冒泡算法呢?如下图所示(图片来自网络): 其实可以看到,第一遍的遍历过程中,首先比较第一对数字,比较交换完成后第二个数字一定是比较大的,接下来比较第二对,同样进行比较交换,那么这个时候第三个数一定是较大的,这样所有的数对比较完成之后,最大的数字就会冒泡到数组的最右侧.接下来第二轮就可以把第二大的数放在右侧数第二个位置上,以此类推...当遍历一遍没有可以交换的数字的时候,就说明这个队列已经是有序的了. 1 public static void ma

JAVA 冒泡算法

每种语言都有冒泡JAVA实现如下: public static void main(String args[]){ System.out.println("Start"); int[] sort ={5,2,6,8,3,1,9,0,4}; Sort(sort); System.out.println("End"); } public static int[] Sort(int[] sort){ for (int i=0;i<sort.length-1;i++)

分享一个多线程实现[冒泡][选择][二分法]排序的例子

线程的使用规则我将会在我另一篇文章<Delphi中使用比较少的一些语法>中进行介绍,这里只开放一篇Delphi原代码的算法: //工程文件:Sort_MultiThread.dpr program Sort_MultiThread; uses  Forms,  SortUI in 'SortUI.pas' {fmSortUI},  SortUC in 'SortUC.pas'; {$R *.res} begin  Application.Initialize;  Application.Mai

java冒泡算法和选择排序法

1 package test.auto; 2 3 import java.util.Arrays; 4 5 import org.apache.bcel.generic.FieldGenOrMethodGen; 6 7 public class Maopao0807{ 8 9 public static void main(String[] args) { 10 //冒泡,每个相邻进行比较 11 int a[]={ 6, 5, 3, 1, 8, 7, 2, 4 , 0}; 12 for (int

Java递归实现二分法,希望各位指点一下

/* 3.使用二分法查找有序数组中元素.找到返回索引,不存在输出-1.使用递归实现   */   import java.util.Scanner;   public class Recursion{   public static void main(String[]args)   {   System.out.println("请输入要找的整数");   Scanner sc=new Scanner(System.in);   int num = sc.nextInt();   i