冒泡排序
从底部选择一个元素,和前面的元素进行比较,交换元素的位置,每次冒出一个最大或者最小的元素。
func BubbleSort(a []int) {
size := len(a)
if size <= 1 {
return
}
for i := 0; i < size; i++ {
flag := false
for j := 0; j < size-i-1; j++ {
if a[j] > a[j+1] {
a[j] = a[j] ^ a[j+1] //此时a[j] = 两个值的异或值
a[j+1] = a[j+1] ^ a[j] //同一个数两次异或为0,所有此时 a[j+1] =a [j]
a[j] = a[j] ^ a[j+1] //a[j]=a[j+1]
flag = true
}
}
if !flag { //如果没有数据交换,提前退出
break
}
}
}
插入排序
把数据分为已排序区和未排序区,从未排序区选一个元素,和已排序区对比,找到合适的位置再插入。
func InsertionSort(a []int) {
size := len(a)
if size <= 1 {
return
}
for i := 1; i < size; i++ {
value := a[i]
j := i - 1
for ; j > 0; j-- {
if a[j] > value {
a[j+1] = a[j]
} else {
break
}
}
a[j+1] = value
}
}
java源码里面的插入排序
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void sort(int[] a, int left,int right){
for (int i = left + 1; i <= right; i++) {
for (int j = i; j > left && a[j] < a[j - 1]; j--) {
swap(a, j, j - 1);
}
}
}
插入排序和冒泡排序都存在比较-交换的过程,不过不同之处在于,冒泡排序是每次选数组一端的数,通过比较交换把最大的数移动到另一端(大端),所以大端是排序好的且都比未排序的要大,后面的的交换中,可以确定未排序区的数数比大端的要小,所以新一轮排序只需要比较到大端的头就能保证排序正确。
插入排序的特点是划分排序区和未排序区 ,每次在靠近排序区选一个元素通过比较交换插入到排序区,相对冒泡,虽然也有排序,但是并不保证排序区的数都比未排序去的大。