---------------------- 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)都有实现好的排序算法