您的位置:首页 > 编程语言 > Java开发

博客一,常见的几种排序算法的Java实现

2015-09-17 00:02 756 查看
一、插入排序

算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下:

public class InsertSort {
public void insertSort(int[] a){
if(a==null||a.length==0||a.length==1){
return ;
}
//i代表已有序的数组元素的边界,
for(int i = 0 ; i<a.length-1 ;i++){
int j = i+1 ;
int temp = a[j];//保存j位置的元素
while(j>=1&&temp < a[j-1]){
a[j] = a[j-1] ;
j-- ;//找到药插入的位置
}
a[j] = temp ;
}
}
public static void main(String[] args) {
InsertSort is = new InsertSort() ;
int[] a = {} ;
is.insertSort(a);
for(int i = 0 ; i < a.length ;i++){
System.out.print(a[i]+" ");
}
}

}


二、希尔排序

希尔排序就是插入排序的一种变形,只不过希尔排序引入了步长的概念,数组中的数字一次移动的距离比直接插入排序要大,减少了数组移动操作的次数。

当步长为1时,希尔排序变成直接插入排序。代码如下

public class ShellSort {
public void shellSort(int[] a){
int j = 0 ;
int temp = 0 ;
for(int d = a.length/2 ; d>0 ;d/=2){
for(int i = d ; i < a.length ; i++){
temp = a[i] ;
for(j = i ; j>=d ;j=j-d ){
if(temp>a[i-d]){
a[j] = a[j-d] ;
}
else{
break ;
}
}
a[j] =temp ;
}
}
}
public static void main(String[] args) {
int[] a = {10,9,4,-1,7,9,5,6,2,-3} ;
ShellSort ss = new ShellSort() ;
ss.shellSort(a);
for(int i = 0 ; i<a.length ;i++){
System.out.print(a[i]+" ");
}
}


三、堆排序

堆排序的时间复杂度是o(nlgn),但是空间复杂度是o(1),堆排序的主要操作就是建堆和调整,排序过程中也是将数组分成有序区和无序区,每次找出无序区中的最大(最小)值加入有序区。一切操作都是在数组上完成,切勿真的去建树,树是数组的逻辑结构。代码如下:

public class HeapSort {
public void heapSort(int[] a){
if(a==null||a.length==0||a.length==1){
return ;
}
for(int i = 0 ; i < a.length ;i++){
createMaxHeap(a,a.length-1-i) ;
swap(a,0,a.length-1-i) ;
}
}
private void swap(int[] a, int i, int j) {
int temp = a[j];
a[j] =a[i];
a[i] = temp ;
}
private void createMaxHeap(int[] a, int lastIndex) {
for(int i = (lastIndex-1)/2 ; i>=0 ;i--){
int k = i ;
while(2*k+1<=lastIndex){
int biggerIndex = 2*k+1 ;
if(biggerIndex<lastIndex&&a[biggerIndex]<a[biggerIndex+1]){
biggerIndex++ ;
}
if(a[k]<a[biggerIndex]){
swap(a,k,biggerIndex);
k = biggerIndex ;
}
else{
break ;
}
}
}
}
public static void main(String[] args) {
HeapSort hs = new  HeapSort() ;
int[] a = {9,-1,0,3,6,7,2} ;
hs.heapSort(a);
for(int i = 0 ; i<a.length ;i++){
System.out.print(a[i]+" ") ;
}
}

}


四、快排

快排每次的关键就是找到左边比标志大的节点,右边比标识小的节点,两者交换位置。

代码如下:

public class Qsort {
public void qSort(int[] a ,int left ,int right){
if(a==null||a.length==0||a.length==1){
return ;
}
int piovt = partion(a,left,right) ;
if(left<piovt){
qSort(a,left,piovt-1) ;
}
if(right>piovt){
qSort(a,piovt,right) ;
}

}
private int partion(int[] a, int left, int right) {
int index = a[(left+right)/2];
while(left<right){
while(a[left]<index){
left++ ;
}
while(a[right]>index){
right-- ;
}
if(left<=right){
exchange(a,left,right) ;
left++ ;
right-- ;
}
}
return left;
}
private void exchange(int[] a, int left, int right) {
int temp = a[left] ;
a[left] = a[right] ;
a[right] = temp ;
}
public static void main(String[] args) {
Qsort qs = new Qsort() ;
int[] a = {5,9,2,1,4,0,-5,-7,-1} ;
qs.qSort(a, 0, a.length-1);
for(int i = 0 ;i<a.length ;i++){
System.out.print(a[i]+" ");
}

}

}


五、归并排序

归并排序基于分治的思想,递归调用。代码如下:

public class MergeSort {
public void mergeSort(int[] a,int left ,int right){
if(a==null||a.length==0||a.length==1){
return ;
}
int middle = (left+right)/2;
if(left<right){
mergeSort(a,left,middle);
mergeSort(a,middle+1,right) ;
}
merge(a,left,middle,right) ;
}
private void merge(int[] a, int begin, int middle, int end) {
int[] temp = new int[end-begin+1] ;
int i = 0  , j = begin , k = middle+1 ;
while(j<=middle&&k<=end){
if(a[j]<=a[k]){
temp[i] = a[j];
j++ ;
}
else{
temp[i] = a[k];
k++ ;
}
i++ ;
}
while(j<=middle){
temp[i] = a[j] ;
i++ ;
j++ ;
}
while(k<=end){
temp[i] = a[k] ;
i++ ;
k++ ;
}
for(int l = 0 ; l < temp.length ;l++){
a[begin+l] = temp[l] ;
}
}

public static void main(String[] args) {
int[] a = {3,9,1,2,6,0,-1,-4,15} ;
MergeSort ms = new MergeSort() ;
ms.mergeSort(a, 0, a.length-1);
for(int i = 0 ;i<a.length ;i++){
System.out.print(a[i]+" ");
}
}

}


六、冒泡排序

每次找出无序序列的最小(最大)代码如下

public class BubbleSort {
public void bubbleSort(int[] a){
if(a==null||a.length==0||a.length==1){
return ;
}
for(int i = 0 ; i < a.length ;i++){
for(int j = 1; j < a.length-i ;j++){
if(a[j] < a[j-1]){
exchange(a,j ,j-1) ;
}
}
}
}
private void exchange(int[] a, int j, int i) {
int temp = a[i] ;
a[i] = a[j];
a[j] =temp ;
}
public static void main(String[] args) {
int[] a = {3,9,1,0,7,-4,-6} ;
BubbleSort bs = new BubbleSort() ;
bs.bubbleSort(a);
for(int i = 0 ; i < a.length ; i++){
System.out.print(a[i]+" ") ;
}
}

}


七、选择排序

每次从数组中选出最大值(最小值)输出,代码如下:

public class SelectSort {
public void selectSort(int[] a){
if(a==null||a.length==0){
return ;
}
for(int i = 0 ; i < a.length ;i++){
for(int j = i+1 ; j < a.length ;j++){
if(a[j] < a[i]){
exchange(a,i ,j) ;
}
}
}
}
private void exchange(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j] ;
a[j] = temp ;
}
public static void main(String[] args) {
SelectSort ss = new SelectSort() ;
int[] a = {7,12,-1,3,7,9} ;
ss.selectSort(a);
for(int i = 0 ; i< a.length ;i++){
System.out.print(a[i]+" ");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: