算法(2)-比较排序-冒泡-插入-选择-java实例源码
冒泡、插入、选择是三种基本的比较排序算法,时间复杂度基本是O(n^2).
冒泡
//冒泡:O(n^2) 值 排序 空间也是O(1) 稳定
//1. 5位置OK 操作N-1次 两两比较 大的交换位置 一次遍历得一个最大值
//2. 4位置OK 操作N-2
//3. 3位置OK 操作N-3
//4. 2位置OK 操作N-4
//5. 1位置OK 操作N-5
/ /大循环--
//循环 每次只两两比较 每次得一个值
//n+(n-1)+(n-2)+(n-3)+....+1
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int e = arr.length - 1; e > 0; e--) {
for (int i = 0; i < e; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
/*
C++
int a[10] = {0,1,2,3,4,5,6,7,8,9};
int length = sizeof(a)/sizeof(a[0]);
*/
插入
//4,3,1,2,5,0
// 0-0 0-1 0-2 0-3... 大循环 每次从0开始
//小循环,从右到左,从后往前 j j+1为操作数 两两比较
public static void insertionSort(int[]arr)
{
if(arr==null||arr.length<2)
{
return;
}
for(int i=1;i<arr.length;i++)//大循环 0-i
{
//0-0 是否有序 是,不用操作 位置 从后向前
//0-1 位置 先看1 再看0位置
//0-2 先看2
//0-3
//0-4
//0-5
//终止条件:1.不比前数小
//2.没有数
//一路向做换 永远处理的是j+1
for(int j=i-1;j>=0&&arr[j]>arr[j+1];j--)
{
swap(arr,j,j+1);
}
}
}
选择
// 选择排序 取最小值 两次遍历 先搞定的是0位置,从左到右++
//看了N个数选最小值,
//O-n-1 选个最小值(里面的循环) 放0位置(外面的循环 ++ i是下标)
//1-n-1选个最小值 记录在minIndex 放1位置
//2-n-1选个最小值 放2位置
//3-n-1选个最小值 放3位置
//4-n-1选个最小值 放4位置
//大循环是范围 i是下标 ++
//小循环:范围内找最小值 ,与前面找到的最小数比较 minIndex记录上
// 范围越来越小。
//1-2 比较 取最小值index
//2-3
//3-4
public static void selectionSort(int[]arr)
{
if(arr==null||arr.length<2)
{
return;
}
for(int i=0;i<arr.length-1;i++)//i~n-1
{
int minIndex=i;
for(int j=i+1;j<arr.length;j++)//
{
minIndex=arr[j]<arr[minIndex]?j:minIndex;//如果arr[j]<arr[minIndex] 返回j
}
swap(arr,i,minIndex);// 交换 i,minIndex
}
}
swap(int arr[],int a,int b)
{
arr[a]=arr[a]^arr[b];
arr[b]=arr[a]^arr[b];
arr[a]=arr[a]^arr[b];
}

浙公网安备 33010602011771号