黑马程序员:排序

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

排序:二分法,冒泡,选择

 二分法:
例:
class BinarySearch {
 public static void main(String[] args) {
  // 定义数组
  int[] arr = { -4, -2, 0, 2, 4, 6 };
  // 得到要找的元素在数组中的角标
  int r = result(arr, 6);
  System.out.println("查6的位置->得到结果 脚标为:" + r);
 }
 // 二分法,也称折半查找,效率比较高。
 public static int result(int[] arr, int input) {
  int min = 0; // 定义最小的角标
  int max = arr.length - 1; // 定义最大的角标
  int mid; // 定义中间的角标
  while (min <= max) {
   /*
    * 每次循环都要给中间角标赋新值(在没有找到要找的元素前,每循环一次,
    * 最大角标或者最小角标其中必然有一个会变化,相应的中间角标也要变)
    */
   mid = (min + max) / 2;
   
   if (arr[mid] < input)// 如果中间角标的值小于要找的数(也就是说要找的数在数组右边)
    min = mid + 1;// 就把最小角标变为原中间角标+1(相当于把左边去掉)
   else if (arr[mid] > input)// 如果中间角标的值大于要找的数(也就是说要找的数在数组左边) 
    max = mid - 1;// 把最大角标变为原中间角标-1(相当于把右边去掉)
   else
    // 如果中间角标的值等于要找的数。。。就说明找到了,直接返回要找的值对应的角标
    return mid;
  }
  // 循环后如果还没有找到,返回-1
  return -1;
 }
}

 冒泡排序:
例:
class BubbleSort {
 /* 1.N个数字来排,两两相比小靠前
  * 2.外层循环N-1,内层循环N-1-i
  */
 public static void main(String[] args) {
  int[] arr = { 9, 1, 3, 8, 6, 2, 5 };
  for (int x = 0; x < arr.length - 1; x++)// 最后一个没有排的必要
  {
   for (int y = 0; y < arr.length - x - 1; y++) {
    if (arr[y] > arr[y + 1]) {//最大值换到最后
     int temp = arr[y];
     arr[y] = arr[y + 1];
     arr[y + 1] = temp;
    }
   }
  }
 }
}
 选择排序:
例:
public class SelectSort {
 /*第一个和其后的比,大则换,
       第二个和其后的比,大则换
 */
 public static void main(String[] args) {
  int[] a = { 25, 15, 42, 16, 12, 36 };
  int tmp = 0;
  for (int i = 0; i < a.length; i++) {//按i下标来一个一个比后面的(i+1后的)
   for (int j = i + 1; j < a.length; j++) {//此for只有j一直在变,下标为i的数,下村不动,值相比
    if (a[i] > a[j]){
    tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
    }
   }
  }
  for (int i = 0; i < a.length; i++)
   System.out.print(a[i] + " ");
 }
}
选择和冒泡区别
这是算法层面的问题
选择排序和冒泡排序都是基于元素交换的
冒泡排序基本思想:每次将最重的一个沉入海底
选择排序基本思想:每次扫描最重的一个与第一个交换
并且,选择和冒泡的时间复杂度是一样的(都是O(N^2))
所以在实际生活中作用不大,一般的语言(比如java,c++,c)都有实现好的排序算法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值