您的位置:首页 > 编程语言 > Java开发

java基本算法总结(冒泡排序、选择排序、插入排序)

2012-03-17 09:58 525 查看
 
package com.java.dataStructArithmeic.sort;

/**

 * @author gongpeibao

 * @since 2012.03.16

 * 基本排序方法

 * 选择排序放比冒泡排序效率高,原因是它的交换次数少了,比较次数都是N*(N-1)/2

 * 插入排序法是这儿最好的一种基本排序方法,虽然排序算法仍然需要O(N^2)的时间,

 * 但是一般情况下比冒泡排序快一倍,比选择排序还要快一点

 * 应用方法:

 * 在数据量很小,并且交换数据相对于比较数据 更加耗时的情况下,应用选择排序

 * 假设数据量很小或基本上有序时,插入排序算法是最好的选择

 * 对于大数据量的排序来说,快速排序是最好的方法

 */

public class BubbleSort {

 

 public static void main(String[] args) {

//  int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5 }; //数组

  int[] values = { 3, 1, 6}; //数组

//  BubbleSort.bubbleSort(values); //冒泡排序

//  selectSort(values);  //选择排序

  insertSort2(values);  //插入排序

  int length = values.length;

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

   System.out.println(values[i]);

  }

 }

 /**

  * 冒泡排序法

  * @param values 排序数组

  */

 public static void bubbleSort(int[] values) {

  int length = values.length;

  // 外面的for循环控制趟数

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

   // 里面的for循环控制比较次数

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

    // 满足条件则交换数据

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

     int temp = values[j];

     values[j] = values[j + 1];

     values[j + 1] = temp;

    }

   }

  }

 }

 /**

  * 选择排序法

  * 交换次数从O(N^2) 降到了O(N)

  * @param values 排序数组

  * 直接选择排序算法的思想比较简单:(假设数据放在一个数组a中,且数组的长度是N)

  * 从a[0]-a[N-1]中选出最小的数据,然后与a[0]交换位置

  * 从a[1]-a[N-1]中选出最小的数据,然后与a[1]交换位置(第1步结束后a[0]就是N个数的最小值)

  * 从a[2]-a[N-1]中选出最小的数据,然后与a[2]交换位置(第2步结束后a[1]就是N-1个数的最小值)

  * 以此类推,N-1次排序后,待排数据就已经按照从小到大的顺序排列了。

  * */

 public static void selectSort(int[] values){

  int length = values.length;

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

  {

            int k = i;  //记录第一个元素的位置,作为比较基准

            for(int j = i; j < length; ++j)

            {

             //如果有比基准小的值,则用小的作为新的基准,同时选出最小的值

                if(values[k] > values[j])

                {

                    k = j;

                }

            }

            if(k != i)

            {

             //交换元素

                int temp = values[i];

                values[i] = values[k];

                values[k] = temp;

            }

        }

 }

 /**

  * 插入排序法

  * @param values 排序数组

  */

 public static void insertSort(int[] values){

  int length = values.length;

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

            int j = -1;

          //找到element[i]应该摆放的位置,此处可以利用查找算法进行优化

            while(j <= i && values[i] > values[++j])

             {

              System.out.println(values[i]+"-"+values[++j]);

             };   //分号,进行空处理

            if(j < i){

                //将j之后的数据移动一位,然后把values[i]移动到j处

                int temp = values[i]; //循环把数组第二个值放到temp里

                for(int k = i-1;k >= j;k--){

                    values[k+1] = values[k];

                }

                values[j] = temp;

            }

        }

 }

 /**

  * 插入排序法 方法2更容易理解

  * @param values 排序数组

  * 不变性

  * 每趟结束时,在temp位置的项插入后,比outer小的下标的数据项都是局部有序的

  */

 public static void insertSort2(int[] values){

  int length = values.length;

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

   //循环把数组第二个值放到temp里

   int tmp = values[i];

   int j = i-1; //从左边的第一个开始比较

   while(tmp<values[j]){ //循环

    values[j+1] = values[j]; //右移一个

    j--;

    if(j == -1) //判断当前元素是否是第一个元素,如果是第一个元素,则停止循环

     break;

   }

   values[j+1] = tmp; //将拿出来的那个放到比其小的位置

  }

 }

 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 java string class 优化
相关文章推荐