对五种排序的实现【java】

标签: 冒泡排序 堆排序 快速排序 java
85人阅读 评论(0) 收藏 举报
分类:

冒泡排序:

package sort;

//冒泡
public class BubbleSort {
	private int[] a;
	public BubbleSort(int[] a) {
		// TODO Auto-generated constructor stub
		this.a = a;
	}
	
	//把小的冒泡到前面,即从小到大
	public void sort() {
		for (int i = 0;i < a.length;i++) {
			for (int j = i+1;j < a.length;j++) {
				if (a[i]>a[j]) {
					int t = a[i];
					a[i] = a[j];
					a[j] = t;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		int a[] = {5,6,4,3,8,6,4};
		BubbleSort sort = new BubbleSort(a);
		sort.sort();
		for (int i:sort.a)
		System.out.println(i);
	}
	
}
插入排序:

package sort;

public class InsertSort {
	
	private int[] a;
	
	public InsertSort(int[] a) {
		// TODO Auto-generated constructor stub
		this.a = a;
	}
	
	//从小到大
	public void sort() {
		for (int i = 0;i < a.length;i++) {
			for (int j = 0;j < i;j++) {
				if (a[i]<a[j]) {
					int t = a[i];
					for (int k = i-1;k >= j;k--) {
						a[k+1] = a[k];
					}
					a[j] = t;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		int a[] = {5,6,4,3,8,6,4};
		InsertSort sort = new InsertSort(a);
		sort.sort();
		for (int i:sort.a)
		System.out.println(i);
	}
}

归并排序:

package sort;


//归并
public class MergeSort {
	private int a[];
	private int length;
	
	public MergeSort(int a[]) {
		// TODO Auto-generated constructor stub
		this.a = a;
		this.length = a.length;
	}
	
	public void sort() {
		MergeSort(0,length-1);
	}
	
	public void MergeSort(int m,int n) {
		int mid = (m + n) / 2;
		if (m < n) {
			MergeSort(m, mid);
			MergeSort(mid + 1, n);
			Merge(m,mid,n);
		}
	}
	
	public void Merge(int m, int mid, int n) {
		System.out.println("Merge("+m+","+mid+","+n+")");
		int p1 = m;
		int p2 = mid + 1;
		int temp[] = new int[n-m+1];
		int p = 0;
		if (m<n) {
			while(p <= n - m) {
				if (p1<=mid&&p2<=n) {
					if (a[p1]<a[p2]) {
						temp[p++] = a[p1++];
					}else {
						temp[p++] = a[p2++];
					}
				}
				else {
					if (p1>mid&&p2<=n) {
						temp[p++] = a[p2++];
					}
					if (p2>n&&p1<=mid) {
						temp[p++] = a[p1++];
					}
				}
			}
			for (int i=0;i<temp.length;i++) {
				a[m + i] = temp[i];
			}
		}
	}
	public static void main(String[] args) {
		int a[] = {5,6,4,3,8,6,4};
		MergeSort sort = new MergeSort(a);
		sort.sort();
		for (int i:sort.a)
		System.out.print(i+",");
	}
}


堆排序:

package sort;


public class HeapSort {
	private int a[];
	private int length;
	public HeapSort(int a[]) {
		// TODO Auto-generated constructor stub
		this.a = a;
		this.length = a.length;
	}
	
	public void MaxHeap(int i) {
		//int parent = (i+1)/2-1;
		int left = 2*(i+1)-1;
		int right = 2*(i+1);
		if (left < length&&a[left] > a[right]&&a[left] > a[i]) {
			int t = a[i];
			a[i] = a[left];
			a[left] = t;
			MaxHeap(left);
		}
		else if (right < length&&a[left] < a[right]&&a[right] > a[i]) {
			int t = a[i];
			a[i] = a[right];
			a[right] = t;
			MaxHeap(right);
		}
	}
	
	public void MakeMaxHeap() {
		for (int i = length/2; i >= 0; i--) {
			MaxHeap(i);
		}
	}
	
	public void toLastPos(int i) {
		int t = a[0];
		a[0] = a[i];
		a[i] = t;
		length--;
	}
	
	public void sort() {
		
		if (a == null || length <= 1) {  
            return;  
        }  
		
		MakeMaxHeap();
		for (int i:a)
		System.out.println("in:"+i);
		//最大的被轮流挤进数组后面,最后变成由大到小排序好的数组
		for(int i = length-1; i > 1; i--) {
			toLastPos(i);
			MaxHeap(0);
		}
		//当剩下两个节点时,这时如果把最大的数挤入数组中会导致还有一个节点没有被排序
		//跳出循环后,剩下的两个节点执行一次MaxHeap(0)即完成了两个节点的排序
		MaxHeap(0);
	}
	
	public static void main(String[] args) {
		int a[] = {-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		HeapSort sort = new HeapSort(a);
		sort.sort();
		for (int i:sort.a)
		System.out.println(i);
	}
}


快速排序:

package sort;

public class QuickSort {
	private int[] a;
	private int length;
	public final static int Left = 0;
	public final static int Right = 1;
	public QuickSort(int a[]) {
		// TODO Auto-generated constructor stub
		this.a = a;
		this.length = a.length;
	}
	
	public void QuickSort(int a[], int m, int n) {
		if (n<=m) {
			return;
		}
		int standard = choose(a, m, n);
		int left = m;//左指针
		int right = n;//右指针
		int LeftOrRight = Left;//默认指针左移
		while(left < right) {
			//指针左移
			if(LeftOrRight==Left) {
				if (a[right] > standard) {
					right--;
				}
				else if (a[right] <= standard&&a[left] >= standard) {
					int t = a[right];
					a[right] = a[left];
					a[left] = t;
					LeftOrRight = Right;
					//这里是为了处理两边都等于基准值的情况,先移动一个指针后让下面的逻辑去处理,以免进入死循环
					if (a[left] == standard&&a[right] == standard) {
						right--;
					}
				}
				else if (a[right] <= standard&&a[left] <= standard) {
					LeftOrRight = Right;//左右都小于基准值时,改变指针移动方向
				}
			}
			//指针右移
			else {
				if (a[left] < standard) {
					left++;
				}
				else if (a[left] >= standard&&a[right] >= standard) {
					LeftOrRight = Left;//左右都大于基准值时,改变指针移动方向
					//这里是为了处理两边都等于基准值的情况,先移动一个指针后让下面的逻辑去处理,以免进入死循环
					if (a[left] == standard&&a[right] == standard) {
						left++;
					}
				}
				else if (a[left] >= standard&&a[right] <= standard) {
					int t = a[right];
					a[right] = a[left];
					a[left] = t;
					LeftOrRight = Left;
				}
			}
		}
		//这里我增加了一段代码,由于在基准值的选择中会出现重复值,处理时找到基准值的最左边界和最右边界
		//理解拙劣,只能采用这种方法。。
		int times=0;
		for (int i = 0; i <a.length;i++) {
			if (a[i]==standard&×==0) {
				left = i;
				times++;
			}
			else if (a[i]==standard&×==0) {
				right = i;
			}
		}
		//System.out.println("m,n="+m+","+n+":standard="+standard);
		QuickSort(a,m,left-1);
		QuickSort(a,right+1,n);
	}
	
	public void sort() {
		QuickSort(a,0,length-1);
	}
	
	public int choose(int[] a, int m, int n){
		int standard = a[m];//选取第一个元素作为基准值
		return standard;
	}
	
	public static void main(String[] args) {
		int a[] = {5,6,4,3,8,6,4,5,234,2,35,23,5};
		QuickSort sort = new QuickSort(a);
		sort.sort();
		for (int i:sort.a)
		System.out.print(i+",");
	}
}



查看评论

五种排序算法的JAVA 实现

1.插入排序 函数代码如下: public void insertSort(int length){ int k = 0; for(int present = ...
  • sinnnnnner
  • sinnnnnner
  • 2016-10-09 19:10:53
  • 439

用Java语言实现五种常用排序

// 选择排序 private static void select_sort(int a[]) { int i, j, t, min; for (i = 0; i < a.length...
  • wbq620524
  • wbq620524
  • 2016-11-03 22:41:32
  • 280

用java来实现对数组{25,24,12,76,101,96,28}

public class Test03 { public static void main(String[] args) { int[] arr = { 25, 24, 12,...
  • privacY_Googol
  • privacY_Googol
  • 2015-05-14 17:33:43
  • 1884

Java 实现ip 地址排序

  • 2010年07月13日 18:01
  • 1KB
  • 下载

在Java中,关于对自定义类的对象排序问题

在日常测试中,经常碰到如何对自己定义的类的对象按照某种方式进行比较排序的问题。比如,我自己定义一个Fish类,然后按照每个Fish对象的属性:age,进行排序。 下边是自定义的Fish类(其中的构造方...
  • Zeroooo00
  • Zeroooo00
  • 2016-10-15 17:54:08
  • 1191

java 如何对自定义的对象进行排序

import java.util.Comparator;import java.util.ArrayList; public class Demo{ public static void main(S...
  • caoyinghui1986
  • caoyinghui1986
  • 2008-03-30 10:13:00
  • 3248

5种常见排序方法深度剖析

# include # include using namespace std; size_t *InsertSort1(size_t *array, size_t size)//直接插入排序双循环写...
  • renchunlin66
  • renchunlin66
  • 2016-04-06 20:05:14
  • 333

Java类对象排序问题---如何对不同类的所有对象进行排序

问题如下:设有A、B两个类,其中均含有属性:java.util.Date time;A中含有若干个属性a1…an,B中含有若干个属性b1…bm, 现在有A的若干个实例 A1 A2 A3 …,B的若干...
  • LoveRestart
  • LoveRestart
  • 2017-03-29 10:35:27
  • 751

Java 数据结构之数组的操作三:实现各种排序方法

使用对象数组实现各种排序方法package com.java.array;/** * @描述 TODO * @项目名称 Java_DataStruct * @包名 ...
  • lovoo
  • lovoo
  • 2016-06-05 16:12:43
  • 315

java 实现ip地址分类并排序

java 实现ip地址分类并排序
  • u014490897
  • u014490897
  • 2017-03-13 17:51:22
  • 445
    个人资料
    等级:
    访问量: 1454
    积分: 176
    排名: 104万+
    文章存档
    最新评论