您的位置:首页 > 职场人生

面试准备之--桶类排序

2016-07-26 20:07 309 查看
下面的算法时间复杂度是o(n),思想不是基于比较的,而是基于桶的

经典排序算法的空间复杂度:

1.o(1):插入排序、选择排序、冒泡排序、堆排序、希尔排序

2.o(logN)~o(N):快速排序

3.o(N):快速排序

4.o(N):归并排序

5.o(M):计数排序、基数排序

不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

1.计数排序

import java.util.*;

public class CountingSort {
public int[] countingSort(int[] A, int n) {
count(A);
return A;
}

public static void count(int[] arr) {
int min = arr[0];
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
min = Math.min(arr[i], min);
max = Math.max(arr[i], max);
}
int[] countArr = new int[max - min + 1];
for (int i = 0; i < arr.length; i++) {
countArr[arr[i] - min]++;
}
int index = 0;
for (int i = 0; i < countArr.length; i++) {
while (countArr[i]-- > 0) {
arr[index++] = i + min;
}
}
}
}


2.基数排序

import java.util.*;

public class RadixSort {
public int[] radixSort(int[] A, int n) {
// write code here基数排序
if(A ==null || n<2)
return null;
int a =1;//除数,分离出关键字的各个整数位
int m=1;//指向的位数
int k=0;// 最后输出的结果
//高维表示0-9个桶,低维表示每个关键字各个位上的余数,每个桶内可能有n个值
int [][] number = new int [10]
;
//创建一个数组表示number数组的每一个桶里面的数目,
int [] count = new int [10];
while(m<=4){
for(int j=0;j<A.length;j++){
int lsd = ((A[j]/a)%10);//得到余数
number[lsd][count[lsd]] =A[j];
count[lsd]++;//余数为lsd,在哪个桶内也确定,因此将桶内的数目自加
}
for(int p=0;p<10;p++){
//将桶内的值取出,重新放入到数组中
if(count[p] !=0){//判断在哪个桶内的并且在该桶内的关键字的个数不为0
for(int q=0;q< count[p];q++){
A[k] = number[p][q];
k++;
}
}
count[p]=0;
}
k=0;
a*=10;
m++;
}
return A;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: