几种排序算法实现以及稳定性

稳定性算法:冒泡排序、插入排序、归并排序、基数排序

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

/**
 * 
 * @author huangsen
 * 插入排序:一个有序数组,一个无序数组,将无序数组插入到有序数组中
 *
 */

public class InsertSortDemo {
    
    public static void insertSort(int[] arr) {
        for(int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int j;
            for(j = i -1; j>=0; j--) {
                if(temp > arr[j]) {
                    break;                                    
                }else {
                    arr[j+1] = arr[j];
                }
                
            }
            arr[j+1] = temp;
        }
        
    }
        
}
 

 

package com.hs.sort;

/**
 * 
 * @author huangsen
 * 归并排序:采用分治思想,对一个数组的排序,我们可以将他分成两个数组来处理,再对这两个数组同样的道理来处理,
 * 将他们分别分成两个数组来处理…… 直到数组无法再细分下去(即数组的长度为1,只有一个元素的数组肯定是有序的),
 * 分为之后的数组进行合并操作,向上整合整个数组,最后到达得到一个有序的数组的目的。
 *
 */

public class MergeSortDemo {
    public static void mergeSort(int[] arr, int start, int end) {
        if(start<end) {
            int mid = (start + end)/2;
            mergeSort(arr, start, mid);
            mergeSort(arr,mid + 1, end);
            merge(arr, start, mid, mid + 1, end);
            
        }
        
    }
    
    public static void merge(int[] arr, int start1, int end1, int start2, int end2) {
        int i = start1;
        int j = start2;
        int k = 0;
        int[] a = new int[end2-start1+1];
         while((i<=end1) && (j<=end2)) {
            if(arr[i]<arr[j]){
                a[k] = arr[i];
                k++;
                i++;        
            }else {
                a[k] = arr[j];
                k++;
                j++;        
            }        
        }
         while(i<=end1) {
            a[k++] = arr[i++];
            
        }
        while(j<=end2) {
            a[k++] = arr[j++];
            
        }
        for(int m = 0; m<a.length; m++)
            arr[m+start1] = a[m];
        
    }

}

 

package com.hs.sort;

/**
 * @author huangsen
 * 选择排序:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
 *
 */

public class SelectSortDemo {
    
    public static void selectSort(int[] arr) {
        for(int i = 0; i<arr.length; i++) {
            int k = i;
            for(int j = i+1; j<arr.length; j++) {
                if(arr[j]<arr[k]) {
                    k = j;
                }
            }
            if(k>i) {
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;        
                
            }
        }
        
    }

}
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值