常见内部排序算法之选择排序

[size=large][color=red]常见内部排序算法[/color][/size]
包括选择[b]排序算法,交换排序算法,插入排序算法,基数算法,桶式算法还有归并算法。[/b]
其中选择排序算法又包括:[b]简单选择排序算法[/b]与[b]堆排序[/b]。
选择算法,顾名思义,就是从中选择需要的,然后再与目标地址进行交换。
[size=medium][color=red]简单选择排序算法:[/color][/size]
package test.aglorith;

public class SelectSort {

//从小到大
public void sort(int[] data) {
int data_len=data.length;
for (int i = 0; i < data_len; i++) {
int big=0;
for (int j=1;j<data_len-i;j++) {
if (data[big]<data[j]) {
big=j;
}
}
int point=data_len-1-i;
if (big!=point) {
int temp=data[point];
data[point]=data[big];
data[big]=temp;
}
print(data);
System.out.println("");
}
}
public static void print(int[] data) {
for(int d:data){
System.out.print(d+",");
}
}
public static void main(String[] args) {
int[] data=new int[]{1,10,2,5,3,6,9};
System.out.println("排序之前!");
print(data);
System.out.println("");
System.out.println("开始排序!");
new SelectSort().sort(data);
}
}

堆排序:包括大顶堆,小顶堆。根据不同需求把根节点与最后一个元素进行交换,每次都循环一个[color=red]建堆-交换[/color]的过程。下面是大顶堆例子:
package test.aglorith;

public class HeapSort {
//排序入口
public void sort(int[] data) {
int lastIndex=data.length-1;
for (int i = 0; i < data.length; i++) {
buildHeap(data, lastIndex-i);
swap(data, 0,lastIndex-i);
print(data);
System.out.println(i);
}
}
//建堆过程
public static void buildHeap(int[] data,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) {
//选择左右子节点中相对较大的
if (data[biggerIndex]<data[biggerIndex+1]) {
biggerIndex++;
}
}
if (data[k]<data[biggerIndex]) {
swap(data, k, biggerIndex);
k=biggerIndex;//need?有根没有相差不多
}else {
break;
}
}
}
}
//交换目标
public static void swap(int[] data,int i,int j) {
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
//打印
public static void print(int[] data) {
for(int d:data){
System.out.print(d+",");
}
}
public static void main(String[] args) {
int[] data=new int[]{1,10,2,5,3,6,9,19,15};
System.out.println("排序之前!");
print(data);
System.out.println("");
System.out.println("开始排序!");
long pre=System.currentTimeMillis();
for (int i = 0; i < 30000; i++) {
new HeapSort().sort(data);
}
long end=System.currentTimeMillis();
System.out.println((end-pre)/300);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值