回顾一下冒泡排序和快速排序
冒泡排序
冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。这个过程就像水中的气泡逐渐上浮,所以称为冒泡排序。
核心步骤:
- 从数组的第一个元素开始,比较相邻的两个元素
- 如果第一个比第二个大,则交换它们的位置
- 对每一对相邻元素重复上述步骤,直到数组末尾
- 完成一轮后,最大的元素会 "浮" 到数组的最后位置
- 重复以上步骤,每次忽略已经排好序的最后一个元素
- 直到没有任何一对元素需要交换,排序完成
static void booble(int[] nums){for(int i=0;i<nums.length-1;i++){for(int j=0;j<nums.length-1-i;j++){if(nums[j+1]<nums[j]){int temp=nums[j+1];nums[j+1]=nums[j];nums[j]=temp;}}}}
比如说目前数组nums为{3,2,1},那么j第一次判断3>2,两者交换,数组为{2,3,1},第二次判断3>1,数组为{2,1,3};
第二次判断的时候呢,由于最后一个元素 已经“浮起来了”,确认为数组中最大的值,那么只需要比较nums.length-1-i,也就是3-1-1=1次就可以了,最终数组为{1,2,3}。
快速排序
快速排序采用分治法(Divide and Conquer)的思想,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序。
核心步骤:
- 选择数组中的一个元素作为 "基准"(pivot)
- 将所有小于基准的元素移到基准前面,所有大于基准的元素移到基准后面(分区操作)
- 对基准左右两个子数组重复以上步骤,直到每个子数组只有一个元素或为空
static void fastSort(int[] nums,int left,int right){if(left<right){int index=partition(nums,left,right);fastSort(nums,left,index-1);fastSort(nums,index+1,right);}}// 分区操作:以最左边元素为基准static int partition(int[] array, int left, int right) {// 选择最左边的元素作为基准int pivot = array[left];// i 是小于等于基准区域的右边界(初始为基准位置)int i = left;// j 从基准的下一个位置开始遍历到右边界for (int j = left + 1; j <= right; j++) {// 如果当前元素小于等于基准,将其加入左侧区域if (array[j] <= pivot) {i++; // 扩展左侧区域swap(array, i, j); // 交换元素到左侧区域}}// 将基准元素交换到左侧区域的最后位置(基准的正确位置)swap(array, left, i);// 返回基准元素的索引return i;}// 交换数组中两个位置的元素static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
主要的函数为分区函数,代码中每次将最左侧的元素定义为pivot,然后寻找比pivot更小的数放在其左边,这时我们用i去定义为小于等于pivot的右边界,j从基准的下一个位置开始一直更新到right右边界。
比如目前数组为3,1,2,4,5,那么j从1开始向后遍历,最终返回的索引i是2,这一次交换完位置的数组为21345。