插入排序
插入排序示意图.gif
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
算法步骤:
1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
public static void insertSort(int[] array) {
for (int i = 1; i < array.length; i++) {
int temp = array[i];
int j;
for (j = i - 1; j >= 0 && temp < array[j]; j--) {
array[j+1] = array[j];
}
array[j+1] = temp;
}
}
冒泡排序
冒泡排序示意图.gif算法步骤:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public static void bubbleSort(int[] array) {
int temp;
//趟数,n个数,找出n-1个数的位置就够了,并不用把n个数字的位置都找出来
for (int i = 0; i < array.length - 1; i++) {
for (int j = 0; j < array.length - 1 - i; j++) {//比较次数
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
快速排序
快速排序示意图.gif算法步骤:
1)从数列中挑出一个元素,称为"基准"(pivot)
2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。>递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
/**
* 排序子数组,采用分治思想,不断递归迭代,当每个子数组都排好了,源数组也就排好了
* @param arr
* @param low
* @param heigh
*/
private static void sortSub(int[] arr, int low, int heigh) {
if (low < heigh) {
int division = partition(arr, low, heigh);
sortSub(arr, low, division - 1);
sortSub(arr, division + 1, heigh);
}
}
/**
* 分水岭,基位,左边的都比这个位置小,右边的都大
* @param arr
* @param low
* @param heigh
* @return
*/
private static int partition(int[] arr, int low, int heigh) {
int base = arr[low]; //用子表的第一个记录做枢轴(分水岭)记录
while (low < heigh) { //从表的两端交替向中间扫描
while (low < heigh && arr[heigh] >= base) {
heigh--;
}
// base 赋值给 当前 heigh 位,base 挪到(互换)到了这里,heigh位右边的都比base大
swap(arr, heigh, low);
while (low < heigh && arr[low] <= base) {
low++;
}
// 遇到左边比base值大的了,换位置
swap(arr, heigh, low);
}
// now low = heigh;
return low;
}
/**
* 交换位置
* @param arr
* @param a
* @param b
*/
public static void swap(int[] arr, int a, int b) {
int temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
网友评论