我想实现一下“最优算法”的排序:把随即的100个数按升序排列.代码如下:
(ps:不考虑资源 浪费问题,只是想实现一下算法,当然有更好的,发个看看啊~~)
import java.util.*;
public class SimperTest
{
static int cunt;
static boolean boo;
public void chang(LinkedList ll,LinkedList ll2,int indexA,int indexB) throws Exception
{
int a=(Integer) ll.get(indexA);
int b=(Integer) ll.get(indexB);
boo=true;
if(a>b)
{
ll.set(indexB, a);
ll.set(indexA, b);
cunt++;
}
else if(a<b)
{
ll.offer(ll.remove(indexB));
}else
{
boo=false;
ll2.add(ll.remove(indexB));
}
}
public void fn(LinkedList ll,int firstIndex,int lastIndex)throws Exception
{
LinkedList ll2=new LinkedList();
cunt=0;
//for(int i=firstIndex+1;i<=lastIndex;i+=(ll2.size()+1)){
int i=firstIndex+1;
do
{
chang(ll,ll2,firstIndex+cunt,i);
if(boo)
{
i++;
}
}while (i<ll.size());
int subcunt=firstIndex+cunt;
ll.addAll(subcunt,ll2);
int n=ll2.size();
if((subcunt-1)>firstIndex&&(lastIndex-subcunt-1)>n)
{
fn(ll,firstIndex,subcunt-1);
fn(ll,subcunt+n+1,lastIndex);
}
else if((subcunt-1)==firstIndex&&(lastIndex-subcunt-1)>n)
{
fn(ll,subcunt+n+1,lastIndex);
}
else if((subcunt-1)>firstIndex&&(lastIndex-subcunt-1)==n)
{
fn(ll,firstIndex,subcunt-1);
}
}
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
// TODO Auto-generated method stub
LinkedList ll=new LinkedList();
for(int i=0;i<=99;i++)
{
ll.add(new Integer((int)(100*Math.random())));
}
System.out.println("size="+ll.size());
SimperTest st=new SimperTest();
st.fn(ll,0, 99);
for(int i=0;i<100;i++)
{
System.out.print(ll.get(i).toString()+"\t");
if((i+1)%10==0)
{
System.out.println("");
}
}
}}
结果就是是不对~~郁闷中,高手帮忙看看改改!!
(ps:不考虑资源 浪费问题,只是想实现一下算法,当然有更好的,发个看看啊~~)
import java.util.*;
public class SimperTest
{
static int cunt;
static boolean boo;
public void chang(LinkedList ll,LinkedList ll2,int indexA,int indexB) throws Exception
{
int a=(Integer) ll.get(indexA);
int b=(Integer) ll.get(indexB);
boo=true;
if(a>b)
{
ll.set(indexB, a);
ll.set(indexA, b);
cunt++;
}
else if(a<b)
{
ll.offer(ll.remove(indexB));
}else
{
boo=false;
ll2.add(ll.remove(indexB));
}
}
public void fn(LinkedList ll,int firstIndex,int lastIndex)throws Exception
{
LinkedList ll2=new LinkedList();
cunt=0;
//for(int i=firstIndex+1;i<=lastIndex;i+=(ll2.size()+1)){
int i=firstIndex+1;
do
{
chang(ll,ll2,firstIndex+cunt,i);
if(boo)
{
i++;
}
}while (i<ll.size());
int subcunt=firstIndex+cunt;
ll.addAll(subcunt,ll2);
int n=ll2.size();
if((subcunt-1)>firstIndex&&(lastIndex-subcunt-1)>n)
{
fn(ll,firstIndex,subcunt-1);
fn(ll,subcunt+n+1,lastIndex);
}
else if((subcunt-1)==firstIndex&&(lastIndex-subcunt-1)>n)
{
fn(ll,subcunt+n+1,lastIndex);
}
else if((subcunt-1)>firstIndex&&(lastIndex-subcunt-1)==n)
{
fn(ll,firstIndex,subcunt-1);
}
}
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
// TODO Auto-generated method stub
LinkedList ll=new LinkedList();
for(int i=0;i<=99;i++)
{
ll.add(new Integer((int)(100*Math.random())));
}
System.out.println("size="+ll.size());
SimperTest st=new SimperTest();
st.fn(ll,0, 99);
for(int i=0;i<100;i++)
{
System.out.print(ll.get(i).toString()+"\t");
if((i+1)%10==0)
{
System.out.println("");
}
}
}}
结果就是是不对~~郁闷中,高手帮忙看看改改!!
解决方案 »
- 关于内部类的使用问题
- 急,xp 上 socket 客户端 连接 2003 上的服务器端,连接不上,什么原因?
- 新手上路,谁能帮我解释这段代码????
- 如何实现方向键读取上一条命令
- 为什么JList里的label要设成透明的?
- 用java如何生成pdf格式的文档?
- 关于类之间的调用
- 请问JAVA在读库时,用state或PreparedStatement得到记录集的时候,总会出现不响应的停顿,请问这是怎么回事?如何解决?分不够再加谢谢!!!
- 请问那里有TextPad4.5的注册码?
- 我编译、运行 《Thinking in java》的第一例子,得不到结果,提示如下:
- 一个extends了2个interface的class,并且有相同名字,不同返回值的方法。
- JAVA基础题目,有一些细节没有搞清楚,希望大家帮忙解决一下?
转自 http://blog.pfan.cn/lovemm插入排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class InsertSort implements SortUtil.Sort{ /* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for(int i=1;i<data.length;i++){
for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
SortUtil.swap(data,j,j-1);
}
}
}}
冒泡排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class BubbleSort implements SortUtil.Sort{ /* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for(int i=0;i<data.length;i++){
for(int j=data.length-1;j>i;j--){
if(data[j]<data[j-1]){
SortUtil.swap(data,j,j-1);
}
}
}
}}选择排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class SelectionSort implements SortUtil.Sort { /*
* (non-Javadoc)
*
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for (int i = 0; i < data.length; i++) {
int lowIndex = i;
for (int j = data.length - 1; j > i; j--) {
if (data[j] < data[lowIndex]) {
lowIndex = j;
}
}
SortUtil.swap(data,i,lowIndex);
}
}}快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class QuickSort implements SortUtil.Sort{ /* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
quickSort(data,0,data.length-1);
}
private void quickSort(int[] data,int i,int j){
int pivotIndex=(i+j)/2;
//swap
SortUtil.swap(data,pivotIndex,j);
int k=partition(data,i-1,j,data[j]);
SortUtil.swap(data,k,j);
if((k-i)>1) quickSort(data,i,k-1);
if((j-k)>1) quickSort(data,k+1,j);
}
/**
* @param data
* @param i
* @param j
* @return
*/
private int partition(int[] data, int l, int r,int pivot) {
do{
while(data[++l]<pivot);
while((r!=0)&&data[--r]>pivot);
SortUtil.swap(data,l,r);
}
while(l<r);
SortUtil.swap(data,l,r);
return l;
}}
改进后的快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class ImprovedQuickSort implements SortUtil.Sort { private static int MAX_STACK_SIZE=4096;
private static int THRESHOLD=10;
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] stack=new int[MAX_STACK_SIZE];
int top=-1;
int pivot;
int pivotIndex,l,r;
stack[++top]=0;
stack[++top]=data.length-1;
while(top>0){
int j=stack[top--];
int i=stack[top--];
pivotIndex=(i+j)/2;
pivot=data[pivotIndex];
SortUtil.swap(data,pivotIndex,j);
//partition
l=i-1;
r=j;
do{
while(data[++l]<pivot);
while((r!=0)&&(data[--r]>pivot));
SortUtil.swap(data,l,r);
}
while(l<r);
SortUtil.swap(data,l,r);
SortUtil.swap(data,l,j);
if((l-i)>THRESHOLD){
stack[++top]=i;
stack[++top]=l-1;
}
if((j-l)>THRESHOLD){
stack[++top]=l+1;
stack[++top]=j;
}
}
//new InsertSort().sort(data);
insertSort(data);
}
/**
* @param data
*/
private void insertSort(int[] data) {
int temp;
for(int i=1;i<data.length;i++){
for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
SortUtil.swap(data,j,j-1);
}
}
}}归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class MergeSort implements SortUtil.Sort{ /* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] temp=new int[data.length];
mergeSort(data,temp,0,data.length-1);
}
private void mergeSort(int[] data,int[] temp,int l,int r){
int mid=(l+r)/2;
if(l==r) return ;
mergeSort(data,temp,l,mid);
mergeSort(data,temp,mid+1,r);
for(int i=l;i<=r;i++){
temp[i]=data[i];
}
int i1=l;
int i2=mid+1;
for(int cur=l;cur<=r;cur++){
if(i1==mid+1)
data[cur]=temp[i2++];
else if(i2>r)
data[cur]=temp[i1++];
else if(temp[i1]<temp[i2])
data[cur]=temp[i1++];
else
data[cur]=temp[i2++];
}
}}改进后的归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class ImprovedMergeSort implements SortUtil.Sort { private static final int THRESHOLD = 10; /*
* (non-Javadoc)
*
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] temp=new int[data.length];
mergeSort(data,temp,0,data.length-1);
} private void mergeSort(int[] data, int[] temp, int l, int r) {
int i, j, k;
int mid = (l + r) / 2;
if (l == r)
return;
if ((mid - l) >= THRESHOLD)
mergeSort(data, temp, l, mid);
else
insertSort(data, l, mid - l + 1);
if ((r - mid) > THRESHOLD)
mergeSort(data, temp, mid + 1, r);
else
insertSort(data, mid + 1, r - mid); for (i = l; i <= mid; i++) {
temp[i] = data[i];
}
for (j = 1; j <= r - mid; j++) {
temp[r - j + 1] = data[j + mid];
}
int a = temp[l];
int b = temp[r];
for (i = l, j = r, k = l; k <= r; k++) {
if (a < b) {
data[k] = temp[i++];
a = temp[i];
} else {
data[k] = temp[j--];
b = temp[j];
}
}
} /**
* @param data
* @param l
* @param i
*/
private void insertSort(int[] data, int start, int len) {
for(int i=start+1;i<start+len;i++){
for(int j=i;(j>start) && data[j]<data[j-1];j--){
SortUtil.swap(data,j,j-1);
}
}
}}
我说下我的思路(新手,别嘲笑,哈)
实际上我就是想重写下sort方法的当然我知道我的方法比真正的方法差了不知道多少倍;
先说下我的思路:要排序一个数组,先随便找出一个数(我选第一个),逐个比较,如果小于它则
归为“左边”大于或等于归于“右边”这样递归下去,最后的结果就是“左边”加“第一个数”加“右边”。
我用的是LinkedList;chang()方法是为了比较两个数,然后排序:当小于“第一个数”则两个数位置互换;
当大于“第一个数”则把被比较的数移到到linkedlist的尾部。若等于“第一个数”则移到新的linkedlist中。
在后面的fn()方法中再用addAll()方法插入.
后面的fn()方法应该很简单了吧,我觉得问题主要就出在这里,但是就是找不出来~~~
没有看明白楼主的排序方法,可以这么实现import java.util.*;
public class SimperTest
{
//冒泡排序
public LinkedList paiXu(LinkedList l1)
{
for(int i=0;i<l1.size();i++)
{
for(int j=l1.size()-1;j>i;j--)
{
int a=(Integer)l1.get(i);
int b=(Integer)l1.get(j);
if(a>b)
{
l1.set(j, a);
l1.set(i, b);
}
}
}
return l1;
}
/**
* @param args
*/
public static void main(String[] args)throws Exception
{
// TODO Auto-generated method stub
LinkedList ll=new LinkedList();
for(int i=0;i<=99;i++)
{
ll.add(new Integer((int)(100*Math.random())));
}
System.out.println("size="+ll.size());
System.out.println("排序前");
for(int i=0;i<100;i++)
{
System.out.print(ll.get(i).toString()+"\t");
if((i+1)%10==0)
{
System.out.println("");
}
}
SimperTest st=new SimperTest();
st.paiXu(ll);
System.out.println("排序后");
for(int i=0;i<100;i++)
{
System.out.print(ll.get(i).toString()+"\t");
if((i+1)%10==0)
{
System.out.println("");
}
}
}}