共同函数交换位置
private static void swap(int[] arr, int i, int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
冒泡排序
1) 原理:
设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1]> A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的”最前面”。
2) 实现1:
每次比较相邻两个数字;
private static int[] otherMaopaoSort(int[] arr){
for(int i = 0; i < arr.length; i++){
for(int j = 0; j< arr.length-i-1; j++){
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
return arr;
}
实现2:这个实现可能不是冒泡排序,反正基本思想就是对比后相互交换位置,所以自己写了一个,如果效率特别低请指出,
这个排序是这么想的,第一个和第二个比,小的排在第一位,下一次第一个和第三个比,一直比到最后,最小的就在第一个,
然后下一轮循环从第二个开始,一直比到最后这样,
private static int[] selfMaopaoSort(int[] arr){
for(int i = 0; i < arr.length-1; i++){
for(int j = i+1; j< arr.length; j++){
if (arr[j] > arr[j+1]) {
swap(arr, j, j+1);
}
}
}
return arr;
}
快速排序
1) 原理:
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
可以理解为选择一个基准将数组分两部分,将基准排好,然后令另外两部分找自己的基准然后在分别排好基准,最后一直到最后的基准排好,利用递归函数反复对基准操作,
2) 实现:
private static int[] quickSort(int[] arr, int low, int heigh){
if (low < heigh) {
int baseSeq = partition(arr, low, heigh);
quickSort(arr, low, baseSeq-1);
quickSort(arr, baseSeq+1, heigh);
}
return arr;
}
private static int partition(int[] arr, int low, int heigh){
//基准
int base = arr[low];
while (low < heigh) {
//右侧指针指向数据大于德语基准,则不进行调换,指针前移
while (low < heigh && arr[heigh] >= base) {
heigh--;
}
//否则进行调换
swap(arr, low, heigh);
//左侧指针指向数据小于基准,则不进行调换,指针后移
while (low < heigh && arr[low] < base) {
low++;
}
//否则进行调换
swap(arr, low, heigh);
}
//经过排序后low等于heigh,为基准下标
return low;
}
注意
一般基准为第一个或者为最后一个,以第一个为例,此时partition方法硬钢先执行指针前移排序,否则第一次的基准不会排序,很简单自己想象就能想到,这只不过是我当时写的时候的坑
直接插入排序
1) 原理:
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的子序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
2) 实现:
private static int[] insertSort(int[] arr){
//第一个默认排序好,第一层控制循环次数
for (int i = 1; i < arr.length; i++) {
//控制将未排序的后一个数据排到正确的位置
for (int j = i-1; j >= 0; j--) {
if (arr[j] > arr[j+1]) {
nonSwap(arr, j, j+1);
}
}
}
return arr;
}
/**
* 不借助中间变量交换两个数的值
* @param arr
* @param i
* @param j
*/
private static void nonSwap(int[] arr, int i, int j){
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}