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("");
}
}
* 排序测试类
*
* 排序算法的分类如下:
* 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("");
}
}
相关文章推荐
- 数据结构算法之排序系列Java、C源码实现(3)--直接选择排序
- 数据结构与算法总结——排序(三)桶排序,计数排序和基数排序
- java中数据结构(一)单链表总结
- java实现 数据结构之8大排序
- 数据结构之排序(九)——总结
- 【数据结构】单链表的倒序、删除相同结点、按值排序等简单操作用java实现
- Java数据结构与算法--高级排序
- Java 数据结构(一)---排序(二) 选择排序
- java数据结构之排序--> 插入排序算法
- Java 数据结构(一)---排序(三) 归并排序
- 数据结构(Java)——查找和排序(1)
- 数据结构及简单算法的总结----之【排序】
- java-数据结构——快速排序
- Java数据结构与算法之数组排序——奇偶排序
- 数据结构之排序总结1
- Java集合数据存储结构总结
- 数据结构与算法-排序总结
- 【数据结构与算法】二叉树的Java实现及特点总结
- <三>java数据结构与算法 选择排序
- 数据结构(Java)——查找和排序(5)