您的位置:首页 > 理论基础 > 数据结构算法

java数据结构之排序总结

2011-12-01 13:04 537 查看
/**
* 排序测试类
*
* 排序算法的分类如下:
* 1.插入排序(直接插入排序、折半插入排序、希尔排序);
* 2.交换排序(冒泡泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序);
* 4.归并排序;
* 5.基数排序。
*
* 关于排序方法的选择:
* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。
*  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
*
*/

public class SortTest {

/**
* @param args
*/

public
static
void main(String[] args) {
int []arr=new
int[]{1,2,5,4,6,7,12,10};

冒泡泡排序
//bubbleSort(arr);
插入排序
//insertSort(arr);
选择排序
//selectSort(arr);
堆排序
heapSort(arr);
for(int
i=0;i<arr.length;i++){
System.out.println(arr[i]);
}

}
public
static
void bubbleSort(int[]arr){
for(int
i=0;i<arr.length;i++)
{

// for(int j=arr.length-2;j>=i;j--)
// {
// if(arr[j]>arr[j+1])
// {
// int tmp=arr[j];
// arr[j]=arr[j+1];
// arr[j+1]=tmp;
// }
// }

for(int
j=0;j<arr.length-i-1;j++)
{
if(arr[j]<arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}

}
}

// 插入排序

public
static
void insertSort(int[]arr){
for(int
i=1;i<arr.length;i++)
{

int tmp=arr[i];
int j=i;
for(;j>0&&tmp>arr[j-1];j--)
//if()

arr[j]=arr[j-1];
arr[j]=tmp;

for(int
m=0;m<arr.length-1;m++){
System.out.print(arr[m]+",");
}
System.out.println("\n");

}
}
// 选择排序:从未排好的数中选一个最大值,插到已排好的序列中

public
static
void selectSort(int[]
arr) {
for (int
i=0;i<arr.length;i++) {
int idx=i;
for(int
j=i+1;j<arr.length;j++)
{
if(arr[j]>arr[idx])
idx=j;
}
if(idx!=i)
{
int tmp=arr[idx];
arr[idx]=arr[i];
arr[i]=tmp;

}
}

}

//堆排序

public
static
void heapSort(int[]
arr) {

for (int
i=( arr.length/2-1);i>=0; i--) {
reheap(arr,i,arr.length-1);
}
int tmp=arr[arr.length-1];
arr[arr.length-1]=arr[0];
arr[0]=tmp;

for (int
j=( arr.length-2);j>0; j--) {
reheap(arr,0,j);
tmp=arr[j];
arr[j]=arr[0];
arr[0]=tmp;

}

}
public
static
void reheap(int[]
arr,int rootIndex,int
lastIndex)
{boolean done=false;
int orphan=arr[rootIndex];
int largeChild=rootIndex*2+1;
int leftChild=0;
int rightChild=0;
while (!done&&largeChild<=lastIndex) {
leftChild=largeChild;
rightChild=leftChild+1;
if(rightChild<lastIndex&&arr[rightChild]>arr[largeChild]){
largeChild=rightChild;
}
if(orphan<arr[largeChild])
{
arr[rootIndex]=arr[largeChild];
rootIndex=largeChild;
largeChild=rootIndex*2+1;

}
else

done=true;

}
arr[rootIndex]=orphan;
for(int
m=0;m<arr.length;m++){
System.out.print(arr[m]+",");
}
System.out.println("");

}

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