目录 题目 1-思路-快排 2- 实现 3- ACM 实现
题目
1-思路-快排
1-1 快排的核心思想
选择一个基准 基准左侧的元素都小于该元素 基准右侧的元素都大于该元素
快速排序算法步骤
① 确定分界点: 方式有三种:第一种取左边界点 q[ l ];第二种取中间点q[ l+r ];第三种取右边界点q[ r ];随机 ② 调整区间(★难点) 使得左半边区间内的数都小于等于 x ;右半边区间内的数都大于等于 x ③ 递归
优美的调整区间
用两个指针分别指向数组的左边和右边,两个指针同时往中间走。 如果指针 i
指向的数组的元素值小于 x
,则指针 i
向右移动一位,以此类推一直往下移动,直到指针 i
所指向的某个元素的值 大于等于 x
,此时指针 i`` 停下不动。 同理此时移动指针 j
,若指针 j
指向的元素的值大于等于 x
则指针 j
便向左移动,直到移动到 j
所指向的值小于等于 x
。
当两个指针都停下来的时候,swap 交换两个指针指向的数,之后两个指针继续往中间走,以此类推直到两个指针相遇为止。
1-2 ⭐快排的实现
public void quickSort ( int [ ] nums, int left, int right) { if ( right<= left) return ; int i = left- 1 ; int j = right+ 1 ; int x = nums[ ( i+ j) / 2 ] ; while ( i< j) { do { i++ ; } while ( nums[ i] < x) ; do { j-- ; } while ( nums[ j] > x) ; if ( i< j) { int tmp = nums[ i] ; nums[ i] = nums[ j] ; nums[ j] = tmp; } } quickSort ( nums, left, j) ; quickSort ( nums, j+ 1 , right) ; }
2- 实现
⭐912. 排序数组——题解思路
class Solution { public int [ ] sortArray ( int [ ] nums) { quickSort ( nums, 0 , nums. length- 1 ) ; return nums; } public void quickSort ( int [ ] nums, int left, int right) { if ( right<= left) return ; int i = left- 1 ; int j = right+ 1 ; int x = nums[ ( i+ j) / 2 ] ; while ( i< j) { do { i++ ; } while ( nums[ i] < x) ; do { j-- ; } while ( nums[ j] > x) ; if ( i< j) { int tmp = nums[ i] ; nums[ i] = nums[ j] ; nums[ j] = tmp; } } quickSort ( nums, left, j) ; quickSort ( nums, j+ 1 , right) ; }
}
3- ACM 实现
public class quickSort { public static void quickSort ( int [ ] nums, int left, int right) { if ( right<= left) return ; int i = left- 1 ; int j = right+ 1 ; int x = nums[ ( i+ j) / 2 ] ; while ( i< j) { do { i++ ; } while ( nums[ i] < x) ; do { j-- ; } while ( nums[ j] > x) ; if ( i< j) { int tmp = nums[ i] ; nums[ i] = nums[ j] ; nums[ j] = tmp; } } quickSort ( nums, left, j) ; quickSort ( nums, j+ 1 , right) ; } public static void main ( String [ ] args) { Scanner sc = new Scanner ( System . in) ; System . out. println ( "输入数组长度" ) ; int n = sc. nextInt ( ) ; int [ ] nums = new int [ n] ; for ( int i = 0 ; i < n; i++ ) { nums[ i] = sc. nextInt ( ) ; } quickSort ( nums, 0 , nums. length- 1 ) ; System . out. println ( "排序结果为" ) ; for ( int i: nums) { System . out. print ( i+ " " ) ; } }
}