排序

1. 冒泡排序

参考链接:冒泡排序

主要思想:从左到右,相邻元素进行比较,根据大小判断是否进行交换。每遍历完一次序列,都会找到一个最大的或最小的放在最右边。这样,经历n-1次,我们就可以将n个元素按一定顺序排列起来(这里是n-1而不是n,如果最大(小)的n-1个都到最右边了,最左边的一定是最小(大)的)。

代码如下:

public class Solution{
    public int[] BubbleSort(int[] arr){
        int length = arr.length;
        int i, j, temp;
        for(i = 0; i < length - 1; i++){                      // n-1轮遍历序列
            for(j = 0; j < length - 1 - i; j++){              // 每一次都是从左到右,比较次数为 n - 1 - i,因为前i轮遍历已经确定了i个最小(大)的数在最右边,不用再比较了
                if(arr[j] < arr[j+1]){                        // 此处是左边小于右边时交换,则最后跑到最右边的是最小的,也就是说数组被从大到小重排
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }
}

2. 快速排序

参考链接:快排及其优化三种快排及四种优化方式

主要思想:选择一个基准值,将小于该值的元素放在其左边,将大于该值的元素放在其右边,再对左右分别进行递归处理。

代码如下:

public class Solution {

    public void QuickSort(int[] a, int s, int t){
        if(s < t){
            int pivotloc = partition(a, s, t);
            QuickSort(a, s, pivotloc - 1);
            QuickSort(a, pivotloc + 1, t);
        }
    }
    
    public int partition(int[] a, int low, int high){          // 一次划分,完成的工作是:“选择一个基准值,将小于该值的元素放在其左边,将大于该值的元素放在其右边”
        int pivotkey = a[low];                                 // 选择基准值,此处选择最左边的元素
        while(low < high){                                     // 停止条件就是low>=high, 即从左到右,从右到左的两个指针相遇了,说明所有的值都跟基准值比较过了
            while(low < high && a[high] >= pivotkey){          //如果右边的大于基准值,就继续往左遍历,直到遇到一个小于基准值的
                --high;
            }
            //swap(a, low, high);                              // 此时有两种原则, 一种是选择交换基准值与a[high],之后又会在此进行交换,基准值就到了一个新的位置
            a[low] = a[high];                                  // 也可以选择先把a[high]放到他该去的位置,之后把a[low]放到他该去的位置,在整个循环结束后,再把基准值放到两个指针相遇的位置(这里有点没太说明白。。)
            while(low < high && a[low] <= pivotkey){
                ++low;
            }
            //swap(a, low, high);
            a[high] = a[low];
        }
        a[low] = pivotkey;
        return low;
    }
    
    public void swap(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    
}
posted @ 2021-03-29 20:46  可乐泡茶  阅读(70)  评论(0)    收藏  举报