关闭

对五种排序的实现【java】

标签: 冒泡排序堆排序快速排序java
70人阅读 评论(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+",");
	}
}



0
0
查看评论

五种排序算法的JAVA 实现

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

java常见五种排序方式

java常见五种排序方式 package com.zhi.sort;public class Sortdemo {/** * 冒泡法排序* 比较相邻的元素。如果第一个比第二个大,就交换他们两个。* 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的...
  • zhihui1017
  • zhihui1017
  • 2015-12-04 09:37
  • 278

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

# include # include using namespace std; size_t *InsertSort1(size_t *array, size_t size)//直接插入排序双循环写法 { assert(array); for (int i = 1; i { size_t tem...
  • renchunlin66
  • renchunlin66
  • 2016-04-06 20:05
  • 305

Java中集合排序---点击表头对数据进行排序

Java中对集合的排序,因为项目中得实现一个点击表头对数据进行排序的功能,当然实现这个效果并不难,你完全可以在点击表头时向Action中发出一个请求,然后在利用排序的Hql语句对数据进行排序,这样你完全可以达到目地;但是性能可就不高了咯。。。。。     ...
  • xusongsong520
  • xusongsong520
  • 2012-11-18 16:19
  • 2321

Java 对Map进行排序的实现方法

Java 对Map进行排序的实现方法HashMap与TreeMap的区别HashMap:最常用的Map,根据键值可以获取Value值,HashMap通过键值的hash来决定存储的位置,存取速度非常快,同时它的这一性质也决定了它不可能存在键值相同的元素同时存在,后加入的会替换先加入的.使用迭代器输出的...
  • qq_26971803
  • qq_26971803
  • 2016-03-26 11:47
  • 653

JAVA对文件内数据进行排序的解决办法

今天在对文件内数据进行排序时,出了点问题,我的做法是这样的:首先从键盘输入一行数数字,用BufferedReader的readline方法获得,然后用FileWriter写入到文件中。跟着用FileReader的read方法,将文件内的数据读入到自己定义的char数组中,最后再用数组的排序函数,但最...
  • ieicihc
  • ieicihc
  • 2008-11-17 18:19
  • 3782

Java中:对已有的List<Bean>进行排序

对于Java中一个已经存在的List来说,要给他排序,传统上有两种方式:一个是Bean要实现Comparable接口,另一个是创建Comparator子类。 第一种方式需要在原有的Bean上扩展Comparable接口,一般使用不多,因为最好不要随意更改JavaBean。 第二种方式则是...
  • u012316953
  • u012316953
  • 2016-12-26 12:30
  • 484

对公司员工年龄进行排序,java实现

要求:对公司的员工年龄进行排序,员工人数大约万名左右,可使用常量大小的辅助空间,要求时间效率为O(n)。 实现思路:使用一个额外的辅助数组用来记录同龄的员工数目。 实现如下: public static void sort(int []ages){ int oldestAge=100; ...
  • a1247529789
  • a1247529789
  • 2016-04-17 16:58
  • 428

Java 实现Map集合排序功能

第一步:Map中新增sort临时键 // 初始化Map集合 List> columns = new ArrayList>(); Map c1 = new HashMap(); c1.put("sort", "8"); c1.put(...
  • FOR_CHINA2012
  • FOR_CHINA2012
  • 2015-01-12 18:35
  • 3596

java 对ArrayList排序,实现Comparable接口

以下前三个代码都是通过实现Comparable接口,或是实例化一个比较器,虽然重点部分重复了,也各有不同,还是都贴上吧。  http://zhidao.baidu.com/question/97784478 java如何对ArrayList中对象按照该对象某属性排序...
  • huhuan19890427
  • huhuan19890427
  • 2012-08-28 19:41
  • 3271
    个人资料
    • 访问:1132次
    • 积分:102
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论