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

 

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; //将拿出来的那个放到比其小的位置
  }
 }
 

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值