publicvoidheapSort(int[] arr){int n = arr.length;for(int i = n /2-1; i >=0; i--){heapify(arr, n, i);}for(int i = n -1; i >0; i--){swap(arr,0, i);heapify(arr, i,0);}}privatevoidheapify(int[] arr,int n,int i){int largest = i;int left =2* i +1;int right =2* i +2;if(left < n && arr[left]> arr[largest]){
largest = left;}if(right < n && arr[right]> arr[largest]){
largest = right;}if(largest != i){swap(arr, i, largest);heapify(arr, n, largest);}}privatevoidswap(int[] arr,int i,int j){int temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}
面试案例
问题:对数组 [5, 3, 8, 6, 2] 进行堆排序。
答案:排序后为 [2, 3, 5, 6, 8]。
计数排序
核心思想
统计每个元素出现的次数,根据统计结果直接构造排序后的数组。
时间复杂度:O(n + k),其中 k 是数据范围。
空间复杂度:O(k)。
代码实现
publicvoidcountingSort(int[] arr){int max =Arrays.stream(arr).max().getAsInt();int[] count =newint[max +1];for(int num : arr){
count[num]++;}int index =0;for(int i =0; i < count.length; i++){while(count[i]>0){
arr[index++]= i;
count[i]--;}}}
面试案例
问题:对数组 [5, 3, 8, 6, 2] 进行计数排序。
答案:排序后为 [2, 3, 5, 6, 8]。
桶排序
核心思想
将数据分配到多个桶中,对每个桶单独排序,最后合并。
时间复杂度:O(n + k)。
空间复杂度:O(n + k)。
代码实现
publicvoidbucketSort(int[] arr){int n = arr.length;List<Integer>[] buckets =newList[n];for(int i =0; i < n; i++){
buckets[i]=newArrayList<>();}for(int num : arr){int index = num / n;
buckets[index].add(num);}for(List<Integer> bucket : buckets){Collections.sort(bucket);}int index =0;for(List<Integer> bucket : buckets){for(int num : bucket){
arr[index++]= num;}}}
面试案例
问题:对数组 [5, 3, 8, 6, 2] 进行桶排序。
答案:排序后为 [2, 3, 5, 6, 8]。
基数排序
核心思想
按照每一位(个位、十位等)进行排序,从低位到高位依次处理。
时间复杂度:O(n * k),其中 k 是数字的最大位数。
空间复杂度:O(n + k)。
代码实现
publicvoidradixSort(int[] arr){int max =Arrays.stream(arr).max().getAsInt();for(int exp =1; max / exp >0; exp *=10){countingSortByDigit(arr, exp);}}privatevoidcountingSortByDigit(int[] arr,int exp){int n = arr.length;int[] output =newint[n];int[] count =newint[10];for(int num : arr){
count[(num / exp)%10]++;}for(int i =1; i <10; i++){
count[i]+= count[i -1];}for(int i = n -1; i >=0; i--){
output[count[(arr[i]/ exp)%10]-1]= arr[i];
count[(arr[i]/ exp)%10]--;}System.arraycopy(output,0, arr,0, n);}