基本的排序算法

插入排序
选择排序
快速排序
。。。。
后续补充

package org.jf.alg.sort;

/**
*
* 数组排序工具类
*
* 数组中不能有空元素
*
* @author junfeng.chen
*
*/
public class Sorter {


/**
*
* 选择排序
* 算法思想:将待排序的集合分为两部分,一部分为已排序的部分,一部分为未排序部分
* 开始时,未排序部分为整个集合,已排序部分为空
* 算法步骤:
* 每次从待排序的集合中找出最大(或最小)的元素,将该元素与集合中第一个元素交换;此时该
* 元素及以前的元素都为排好序的
*
* i<-- [0 - size-1]
* j<-- [i+1 - size-1]//未排好序的元素 i-size-1
* find min from [i+1 - size - 1]
*
* exchange min and a[i]
*
* O(n2)
* @param objs
*/
public static void selectSort(Comparable [] objs)
{
if(objs==null || objs.length<=1)
return;

for(int i=0;i<objs.length-1;i++)
{
Comparable little = objs[i];
int little_indx = i;
for(int j=i+1;j<=objs.length-1;j++)
{
if(objs[j].compareTo(little)<0)
{
little = objs[j];
little_indx = j;
}
}
if(little_indx != i)
{
Comparable tmp = objs[i];
objs[i] = objs[little_indx];
objs[little_indx] = tmp;
}
}
}


/**
*
* 将数组分成两部分,一部分为已排序不分,另一部分未排序
* 开始时,已排序不分为空集合;未排序不分为整个数组
* 每次取未排序部分的第一个元素,插入到已排序部分的适当位置
*
*
* 插入排序
* @param objs
*/
public static void insertSort(Comparable objs[])
{

for(int i=0;i<objs.length;i++)
{
Comparable max = objs[i];

for(int j=0;j<i;j++)
{
if(objs[j].compareTo(max)>0)//找到位置
{
for(int k = i;k>j;k--)//后面的元素 依次后移
{
objs[k] = objs[k - 1];
}
objs[j]=max;
break;
}
}
}

}



/**
*
*取首元素作为基准
* @param objs
* @param start
* @param end
*/
public static int partition(Comparable objs[],int start,int end)
{
Comparable pivot = objs[start];
int left = start;
int right = end;
while(left < right)
{
while(pivot.compareTo(objs[right])<0)
right --;
while(left < right &&
pivot.compareTo(objs[left])>=0)
{
left ++ ;
}

if(left < right)
{
Comparable tmp = objs[left];
objs[left] = objs[right];
objs[right] = tmp;
}

}
int pos = right;
objs [start] = objs[pos];
objs [pos] = pivot;

return pos;
}

/**
* 三数取中 作为基准
* @param objs
* @param start
* @param end
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static int partition2(Comparable objs[],int start,int end)
{
int left = start;
int right = end;
int mid_indx = (left+right)/2;
Comparable mid = objs[(left+right)/2];
if(objs[left].compareTo(mid)<0)
{
if(mid.compareTo(objs[right])<=0)
mid_indx =mid_indx ;//pivot = mid;
else
{
if( objs[left].compareTo(objs[right])>0)
mid_indx = left;//pivot = objs[left];
else
mid_indx = right;//pivot = objs[right];
}
}else
{
if(mid.compareTo(objs[right])>=0)
mid_indx = mid_indx;//pivot = mid;
else
{
if(objs[left].compareTo(objs[right])>=0)
mid_indx = right;//pivot = objs[right];
else
mid_indx = left;//pivot = objs[left];

}
}

Comparable tp = objs[start];
objs[start] = objs[mid_indx];
objs[mid_indx] = tp;

Comparable pivot = objs[start];
while(left < right)
{
while(pivot.compareTo(objs[right])<0)
right --;
while(left < right &&
pivot.compareTo(objs[left])>=0)
{
left ++ ;
}

if(left < right)
{
Comparable tmp = objs[left];
objs[left] = objs[right];
objs[right] = tmp;
}
}
int pos = right;
objs [start] = objs[pos];
objs [pos] = pivot;

return pos;
}

public static void quickSort(Comparable objs[],int start,int end)
{
if(start >= end)
return;
int pos = partition2(objs,start,end);
quickSort(objs,start,pos -1);
quickSort(objs,pos+1,end);
}

/**
* 快速排序
* 采用3位取中法 定基准
* @param objs
*/
public static void quickSort(Comparable objs[])
{
quickSort(objs,0,objs.length-1);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值