3月打卡活动第31天 LeetCode第912题:排序数组(中等)
题目:给定一个整数数组 nums,将该数组升序排列。 解题思路1:借着这道题复习一下排序方法吧。冒泡排序,依次从大到小确定。
class Solution {
public int [ ] sortArray ( int [ ] nums) {
int len = nums. length;
for ( int i= 0 ; i< len; i++ ) {
for ( int j= 0 ; j< len- 1 - i; j++ ) {
if ( nums[ j] > nums[ j+ 1 ] ) {
int temp = nums[ j+ 1 ] ;
nums[ j+ 1 ] = nums[ j] ;
nums[ j] = temp;
}
}
}
return nums;
}
}
解题思路2:选择排序看来还是比冒泡要好呀,从小到大确定。
class Solution {
public int [ ] sortArray ( int [ ] nums) {
int len = nums. length;
for ( int i= 0 ; i< len; i++ ) {
int index = i;
for ( int j= i+ 1 ; j< len; j++ ) {
if ( nums[ j] < nums[ index] ) {
index = j;
}
}
int temp = nums[ index] ;
nums[ index] = nums[ i] ;
nums[ i] = temp;
}
return nums;
}
}
解题思路3:插入排序,保持当前元素左侧始终是排序后的数组,依次确定当前数的位置。
class Solution {
public int [ ] sortArray ( int [ ] nums) {
int len = nums. length;
for ( int i= 1 ; i< len; i++ ) {
for ( int j= i; j> 0 ; j-- ) {
if ( nums[ j] < nums[ j- 1 ] ) {
int temp= nums[ j- 1 ] ;
nums[ j- 1 ] = nums[ j] ;
nums[ j] = temp;
} else break ;
}
}
return nums;
}
}
class Solution {
public int [ ] sortArray ( int [ ] nums) {
int max = - 50001 , min = 50001 ;
for ( int num: nums) {
max = Math. max ( num, max) ;
min = Math. min ( num, min) ;
}
int [ ] counter = new int [ max - min + 1 ] ;
for ( int num: nums) {
counter[ num - min] ++ ;
}
int idx = 0 ;
for ( int num = min; num <= max; num++ ) {
int cnt = counter[ num - min] ;
while ( cnt-- > 0 ) {
nums[ idx++ ] = num;
}
}
return nums;
}
}
作者:sweetiee
链接:https: / / leetcode- cn. com/ problems/ sort- an- array/ solution/ dang- wo- tan- pai- xu- shi- wo- zai- tan- xie- shi- yao- by- s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解做法2:归并排序。归并排序是典型的使用分治思想(divide-and-conquer)解决问题的案例。在排序的过程中,把原来的数组变成左右两个数组,然后分别进行排序,当左右的子数组排序完毕之后,再合并这两个子数组形成一个新的排序数组。整个过程递归进行,当只剩下一个元素或者没有元素的时候就直接返回。
private void mergeSort ( int [ ] nums, int left, int right) {
if ( left >= right) return ;
int mid = ( left+ right) / 2 ;
mergeSort ( nums, left, mid) ;
mergeSort ( nums, mid+ 1 , right) ;
int [ ] temp = new int [ right- left+ 1 ] ;
int i= left, j= mid+ 1 ;
int cur = 0 ;
while ( i<= mid&& j<= right) {
if ( nums[ i] <= nums[ j] ) temp[ cur] = nums[ i++ ] ;
else temp[ cur] = nums[ j++ ] ;
cur++ ;
}
while ( i<= mid) temp[ cur++ ] = nums[ i++ ] ;
while ( j<= right) temp[ cur++ ] = nums[ j++ ] ;
for ( int k = 0 ; k < temp. length; k++ ) {
nums[ left+ k] = temp[ k] ;
}
}
作者:bryansun2020
链接:https: / / leetcode- cn. com/ problems/ sort- an- array/ solution/ shi- er- chong- pai- xu- suan- fa- bao- ni- man- yi- dai- gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题解做法3:快速排序,其核心的思路是取第一个元素(或者最后一个元素)作为分界点,把整个数组分成左右两侧,左边的元素小于或者等于分界点元素,而右边的元素大于分界点元素,然后把分界点移到中间位置,对左右子数组分别进行递归,最后就能得到一个排序完成的数组。当子数组只有一个或者没有元素的时候就结束这个递归过程。
private void quickSort ( int [ ] nums, int left, int right) {
if ( left >= right) return ;
int lo = left+ 1 ;
int hi = right;
while ( lo<= hi) {
if ( nums[ lo] > nums[ left] ) {
swap ( nums, lo, hi) ;
hi-- ;
} else {
lo++ ;
}
}
lo-- ;
swap ( nums, left, lo) ;
quickSort2 ( nums, left, lo- 1 ) ;
quickSort2 ( nums, lo+ 1 , right) ;
}
作者:bryansun2020
链接:https: / / leetcode- cn. com/ problems/ sort- an- array/ solution/ shi- er- chong- pai- xu- suan- fa- bao- ni- man- yi- dai- gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
private void heapSort ( int [ ] nums) {
heapify ( nums) ;
for ( int i = nums. length - 1 ; i >= 1 ; i-- ) {
swap ( nums, 0 , i) ;
rebuildHeap ( nums, 0 , i- 1 ) ;
}
}
private void heapify ( int [ ] nums) {
for ( int i = 1 ; i < nums. length; i++ ) {
int par = ( i- 1 ) >> 1 ;
int child = i;
while ( child> 0 && nums[ par] < nums[ child] ) {
swap ( nums, par, child) ;
child = par;
par = ( par- 1 ) >> 1 ;
}
}
}
private void rebuildHeap ( int [ ] nums, int par, int last) {
int left = 2 * par+ 1 ;
int right = 2 * par+ 2 ;
int maxIndex = left;
if ( right<= last && nums[ right] > nums[ left] ) {
maxIndex = right;
}
if ( left<= last && nums[ par] < nums[ maxIndex] ) {
swap ( nums, par, maxIndex) ;
rebuildHeap ( nums, maxIndex, last) ;
}
}
作者:bryansun2020
链接:https: / / leetcode- cn. com/ problems/ sort- an- array/ solution/ shi- er- chong- pai- xu- suan- fa- bao- ni- man- yi- dai- gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
private int [ ] bstSort ( int [ ] nums) {
TreeNode root = new TreeNode ( nums[ 0 ] ) ;
for ( int i = 1 ; i < nums. length; i++ ) {
buildTree ( root, nums[ i] ) ;
}
inorderTraversal ( root, nums, new int [ 1 ] ) ;
return nums;
}
private void inorderTraversal ( TreeNode node, int [ ] nums, int [ ] pos) {
if ( node == null) return ;
inorderTraversal ( node. left, nums, pos) ;
nums[ pos[ 0 ] ++ ] = node. val;
inorderTraversal ( node. right, nums, pos) ;
}
private void buildTree ( TreeNode node, int num) {
if ( node == null) return ;
if ( num >= node. val) {
if ( node. right == null) {
node. right = new TreeNode ( num) ;
} else {
buildTree ( node. right, num) ;
}
} else {
if ( node. left == null) {
node. left = new TreeNode ( num) ;
} else {
buildTree ( node. left, num) ;
}
}
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode ( int val) {
this . val = val;
}
}
作者:bryansun2020
链接:https: / / leetcode- cn. com/ problems/ sort- an- array/ solution/ shi- er- chong- pai- xu- suan- fa- bao- ni- man- yi- dai- gift/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。