java数据结构之排序总结

来源:互联网 发布:mac 日服加速器 编辑:程序博客网 时间:2024/04/28 06:41
 

/**

 * 排序测试类

 *

 * 排序算法的分类如下:

 * 1.插入排序(直接插入排序、折半插入排序、希尔排序);

 * 2.交换排序(冒泡泡排序、快速排序);

 * 3.选择排序(直接选择排序、堆排序);

 * 4.归并排序;

 * 5.基数排序。

 *

 * 关于排序方法的选择:

 * (1)若n较小(如n≤50),可采用直接插入或直接选择排序。

 *  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。

 * (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;

 * (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

 *

 */

 

 

 

public class SortTest {

/**

* @param args

*/

 

publicstaticvoid main(String[] args) {

int []arr=newint[]{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]);

}

}

publicstaticvoid 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;

}

}

}

}

// 插入排序

 

publicstaticvoid 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");

}

}

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

 

publicstaticvoid 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;

}

}

}

//堆排序

 

publicstaticvoid 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;

}

 

 

}

publicstaticvoid 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("");

}

}

 

原创粉丝点击