面试准备之--桶类排序
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.计数排序
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;
}
}
经典排序算法的空间复杂度:
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;
}
}
相关文章推荐
- StackOverflow程序员推荐:每个程序员都应读的30本书
- 剑指offer面试题39:二叉树深度以及判断平衡二叉树
- 剑指offer面试题38:数字在排序数组中出现的次数
- 最全前端面试问题及答案总结(转载自hawx1993)
- 数组去重 算法实现
- 面试准备之---排序
- java研发面试准备
- PHP高级程序员必学
- 为什么中国的程序员总被称为码农?
- FAE面试后的自我反思
- iOS新手求职(本人经历)
- 转 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告
- .Net程序员应该掌握的正则表达式
- 【.Net码农】C#中的partial class(部分类)
- 国内一线互联网公司内部面试题库
- java面试题(有些是转载)
- 面试准备之--字符串旋转
- 晋升的为什么不是你
- 面试题(二)—Java基础(下)
- JAVA多线程和并发基础面试问答