`

java 数据结构学习之(二) 简单排序

 
阅读更多

冒泡排序最经典:

public void BubbleSort1(){

		for (int i = nElement - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
				if(arr[j] > arr[j+1]){
					swap(j,j+1);
				}
			}
		}
	}

private void swap(int a,int b){
	    arr[a] = arr[a] + arr[b];
		arr[b] = arr[a] - arr[b];
		arr[a] = arr[a] - arr[b];
	}

 

以下是冒泡排序排序的改进版本:

 

/**(优化后的冒泡排序)
	 * 双向冒泡排序 
	 * ps: 获取最大的数放在最右边后,回头获取最小的数放在最左边。以此类推,外层循环次数 n / 2,貌似比单向冒泡快一点。
	 */
	public void BubbleSort2(){
		int i,j,k,left = 0,right = nElement - 1;
		for (i = nElement/2; i > 0; i--) {
			for (j = left; j < right; j++) {
				if(arr[j] > arr[j+1]){
					swap(j,j+1);
				}
			}
			for (k = right - 1; k > left; k--) {
				if(arr[k] < arr[k - 1] ){
					swap(k,k - 1);
				}
			}
			left++;
			right--;
		}
	}
	
	/**(优化后的冒泡排序)
	 * ps:如果 有一次比较没有做任何数据移动,说明已经排好序了,可以结束比较了。
	 */
	public void BubbleSort3(){
		boolean isSorted = false;
		for (int i = nElement - 1; i > 0 && !isSorted; i--) {
			isSorted = true;//假设已经排好序
			for (int j = 0; j < i; j++) {
				if(arr[j] > arr[j + 1]){
					swap(j,j + 1);
					isSorted = false;
				}
			}
		}
	}
	
	/**(优化后的冒泡排序)
	 * ps:记录最后一次交换位置,这样就可以确定到底那些区域还没有排好序,缩小比较范围。
	 */
	public void BubbleSort4(){
		int lastIndex = nElement - 1,j=0;
		while(lastIndex > 0){
			for (int i = j = 0; i < lastIndex; i++) {
				if(arr[i] > arr[i + 1]){
					swap(i, i+1);
					j = i;
				}
			}
			lastIndex = j;
		}
	}

 

其中BubbleSort2减少了每次比较的次数,提高了效率。而3,4这两个方法也是同样的原理,减少了可能会做的无用功。

 

下面是选择排序,这个排序是通过减少移动数组的次数来提高效率的。

 

public void selectSort() {
		for (int i = 0; i < nElement - 1; i++) {
			int k = i;
			for (int j = i + 1; j < nElement; j++) {
				if (arr[k] > arr[j]) {
					k = j;
				}
			}
			if (k != i) {
				swap(k, i);
			}
		}
	}

 

最后是选择排序,这个排序比冒泡排序应该要快一倍,比选择排序要快一点。如果是倒序排序的话,则可能没有优势,在基本有序的情况下还是可以的。

 

public void insertSort(){
		int repeat = 0,t = 0;
		for (int i = 1; i < nElement; i++) {
			int j = i;
			while (j > t && arr[i] <= arr[j - 1]){
				//发现重复值 设置为-1
				if(arr[i]==arr[j - 1]){
					arr[i] = -1;
					repeat++;
				}
				--j;
			}
			t = repeat;
			if(j < i){
				int temp = arr[i];
				for (int k = i; k > j; k--) {
					arr[k] = arr[k - 1];
				}
				arr[j] = temp;
			}
		}
		if(repeat > 0){
			nElement = nElement - repeat;
			for (int i = 0; i < nElement; i++) {
				arr[i] = arr[i + repeat];
			}
		}
		
	}

上面这个排序还加了个删除重复值的功能。

 

另外一种实现,感觉没有上面的效率高

 

public void insertSort2(){
		for (int i = 1; i < nElement; i++) {
			int j = i;
			int temp = arr[i];
			while(j > 0 && temp < arr[j - 1]){
				arr[j] = arr[--j];
			}
			arr[j] = temp;
		}
	}

效率没有第一种高的环境是在倒序的情况下,因为这个环境下移动的次数比较多,原来分开移动没有一次性移动快。其他情况下是差不多的。

下面贴出所有的代码

 

package sort;

public class Sort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Sort o = new Sort(10000);
		for (int i = 10; i > 0; i--) {
			o.insert(i);
		}
		o.insert(9);
		o.insert(8);
		/*for (int i = 0; i < 10000; i++) {
			o.insert(i);
		}*/
		long begin = System.currentTimeMillis();
		o.insertSort();
		long end = System.currentTimeMillis();
		System.out.println("time="+(end - begin));
		o.display();
	}

	private int[] arr = null;
	private int nElement = 0;//当前数组的实际长度
	public Sort(int size){
		this.arr = new int[size];
		this.nElement = 0;
	}
	
	public int[] getArr(){return this.arr;}
	
	/**插入
	 * @param c
	 */
	public void insert(int c){
		arr[nElement++] = c;
	}
	
	public void BubbleSort1(){
		for (int i = nElement - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
				if(arr[j] > arr[j+1]){
					swap(j,j+1);
				}
			}
		}
	}
	
	/**(优化后的冒泡排序)
	 * 双向冒泡排序 
	 * ps: 获取最大的数放在最右边后,回头获取最小的数放在最左边。以此类推,外层循环次数 n / 2,貌似比单向冒泡快一点。
	 */
	public void BubbleSort2(){
		int i,j,k,left = 0,right = nElement - 1;
		for (i = nElement/2; i > 0; i--) {
			for (j = left; j < right; j++) {
				if(arr[j] > arr[j+1]){
					swap(j,j+1);
				}
			}
			for (k = right - 1; k > left; k--) {
				if(arr[k] < arr[k - 1] ){
					swap(k,k - 1);
				}
			}
			left++;
			right--;
		}
	}
	
	/**(优化后的冒泡排序)
	 * ps:如果 有一次比较没有做任何数据移动,说明已经排好序了,可以结束比较了。
	 */
	public void BubbleSort3(){
		boolean isSorted = false;
		for (int i = nElement - 1; i > 0 && !isSorted; i--) {
			isSorted = true;//假设已经排好序
			for (int j = 0; j < i; j++) {
				if(arr[j] > arr[j + 1]){
					swap(j,j + 1);
					isSorted = false;
				}
			}
		}
	}
	
	/**(优化后的冒泡排序)
	 * ps:记录最后一次交换位置,这样就可以确定到底那些区域还没有排好序,缩小比较范围。
	 */
	public void BubbleSort4(){
		int lastIndex = nElement - 1,j=0;
		while(lastIndex > 0){
			for (int i = j = 0; i < lastIndex; i++) {
				if(arr[i] > arr[i + 1]){
					swap(i, i+1);
					j = i;
				}
			}
			lastIndex = j;
		}
	}
	
	/**
	 * 奇偶排序 
	 * 第一次比较奇数对,第二次比较偶数对。
	 * 听说如果是多处理器这样排序效率高 
	 */
	public void OddEvenSort(){
		boolean isSorted = false;int i=0;
		while(!isSorted){
			i++;
			isSorted = OddOrEventSort(0) || OddOrEventSort(1);
		}
		System.out.println(i);
	}
	
	private boolean OddOrEventSort(int i){
		boolean isSorted = true;
		for (int j = i; j < nElement - 1; j+=2) {
			if(arr[j] > arr[j+1]){
				swap(j, j+1);
				isSorted = false;
			}
		}
		return isSorted;
	}
	
	public void insertSort(){
		int repeat = 0,t = 0;
		for (int i = 1; i < nElement; i++) {
			int j = i;
			while (j > t && arr[i] <= arr[j - 1]){
				//发现重复值 设置为-1
				if(arr[i]==arr[j - 1]){
					arr[i] = -1;
					repeat++;
				}
				--j;
			}
			t = repeat;
			if(j < i){
				int temp = arr[i];
				for (int k = i; k > j; k--) {
					arr[k] = arr[k - 1];
				}
				arr[j] = temp;
			}
		}
		if(repeat > 0){
			nElement = nElement - repeat;
			for (int i = 0; i < nElement; i++) {
				arr[i] = arr[i + repeat];
			}
		}
		
	}
	
	public void insertSort2(){
		for (int i = 1; i < nElement; i++) {
			int j = i;
			int temp = arr[i];
			while(j > 0 && temp < arr[j - 1]){
				arr[j] = arr[--j];
			}
			arr[j] = temp;
		}
	}
	
	public static void insertSort(int[] elements){ 
        for(int i = 1;i <elements.length; i++){ 
            int j = -1; 
            while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化 
            if(j < i){ 
                //将j之后的数据移动一位,然后把elements[i]移动到j处 
                int temp = elements[i]; 
                for(int k = i-1;k >= j;k--){ 
                    elements[k+1] = elements[k]; 
                } 
                elements[j] = temp; 
            } 
        } 
}
	
	public void selectSort() {
		for (int i = 0; i < nElement - 1; i++) {
			int k = i;
			for (int j = i + 1; j < nElement; j++) {
				if (arr[k] > arr[j]) {
					k = j;
				}
			}
			if (k != i) {
				swap(k, i);
			}
		}
	}
	public void display(){
		for (int i = 0; i <nElement; i++) {
			System.out.println(arr[i]);
		}
	}
	
	private void swap(int a,int b){
	    arr[a] = arr[a] + arr[b];
		arr[b] = arr[a] - arr[b];
		arr[a] = arr[a] - arr[b];
	}
}

 

分享到:
评论

相关推荐

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是一本深入探讨Java编程中数据结构和算法的书籍。数据结构是计算机科学的基础,它涉及到如何有效地组织和存储数据,以便在各种操作下高效地访问和修改。算法则是解决问题的具体步骤...

    java数据结构大作业,排序算法是性能比较

    在Java数据结构的学习中,排序算法的性能比较是一项重要的实践任务。这个大作业的主要目标是对多种排序算法,包括直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序和归并排序,进行性能分析。下面...

    Java数据结构和算法.pdf

    资源摘要信息是关于Java数据结构和算法的知识点总结,涵盖了数组、栈与队列、链表、递归、哈希表、高级排序、二叉树、红黑树、堆、带权图等数据结构和算法概念。 一、数组 * 数组是相同类型变量的集合,可以使用...

    Java版数据结构学习资料

    这份"Java版数据结构学习资料"提供了丰富的学习资源,包括PPT和实践代码,旨在帮助学习者深入理解数据结构并提升编程能力。下面将详细阐述其中涉及的主要知识点。 一、数据结构基本概念 数据结构是指在计算机中存储...

    JAVA数据结构排序动态演示

    在这个"JAVA数据结构排序动态演示"项目中,开发者通过实现一系列经典的排序算法并配合动态界面展示,使学习者能直观地理解各种排序算法的工作原理。 首先,我们来详细解析每个排序算法: 1. **直接插入排序(直接...

    Java数据结构和算法中文第二版

    通过阅读“Java数据结构和算法中文第二版”,学习者能够系统地了解这些基础知识,并通过实践加深理解。同时,加入特定的编程群组,如文中提到的“524621833”,也有助于获取最新的资源、交流经验和解决实际问题。

    《Java数据结构和算法》学习笔记(2)——4种简单排序算法

    此外,它们的简单性使得初学者容易理解和实现,是学习数据结构和算法的良好起点。 在实际开发中,我们往往使用更高效的排序算法,如快速排序、归并排序、堆排序等。然而,了解并能实现这些基础排序算法,对于提升...

    数据结构java版 排序算法

    【数据结构与排序算法在Java中的应用】 在计算机科学中,数据结构是组织和存储数据的方式,而排序算法则是对这些数据进行排列的策略。在Java编程中,掌握各种排序算法对于提高程序效率至关重要。本篇文章将深入探讨...

    Java数据结构和算法(第二版)+源代码+Applets

    本资源包“Java数据结构和算法(第二版)+源代码+Applets”为学习者提供了一个全面且深入的学习平台,涵盖了理论知识、实践代码以及直观的交互式演示。 首先,让我们详细探讨数据结构这一部分。数据结构是组织和存储...

    java数据结构全套

    《Java数据结构全套》是针对Java编程语言深入学习数据结构的重要资源集合,涵盖了从基本概念到高级应用的全面知识体系。这个压缩包包含了四部分关键内容:叶核亚编著的《数据结构(Java版)(第3版)》电子教案、...

    java数据结构与算法.pdf

    Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...

    Java数据结构和算法(第二版)+随书源代码+applet小程序

    《Java数据结构和算法(第二版)》是一本专为希望深入...通过《Java数据结构和算法(第二版)》的学习,配合Applet小程序的动态演示,读者不仅能掌握理论知识,还能提高解决实际问题的能力,对提升Java编程水平大有裨益。

    java数据结构与算法中文版

    《Java数据结构与算法...总的来说,《Java数据结构与算法中文版》是Java开发者提升自身技术水平的宝贵资源,通过深入学习和实践书中的内容,可以提高代码质量,解决复杂问题,并为软件工程的优化和扩展打下坚实基础。

    Java数据结构和算法(第二版).zip

    《Java数据结构和算法》(第2版)介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和...

    Java数据结构课件

    在学习Java数据结构时,会涉及递归、排序算法(如冒泡排序、选择排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)等内容。同时,还会学习如何通过抽象数据类型(ADT)和接口来设计和实现自定义的数据...

    java 数据结构 算法 第二版 中+英文版

    《Java 数据结构 算法 第二版》是一本深入探讨Java编程中数据结构和算法的权威书籍。这本书分为中文和英文两个版本,为读者提供了双语学习的便利。其中,英文版采用PDF格式,而中文版则为PDG格式。为了确保读者能够...

    java数据结构和算法(第二版)[含源码]

    《Java数据结构与算法(第二版)》是一本深度探讨Java编程中数据结构和算法的专著,包含源码分析,旨在帮助读者深入理解并掌握这些核心概念。数据结构是计算机存储、组织数据的方式,而算法则是解决问题或执行任务的...

    数据结构(java版本)

    总的来说,《数据结构(Java版本)》是一本适合程序员入门的教材,通过学习,你可以系统地掌握数据结构和算法,并用Java语言进行实现,为今后的软件开发打下坚实的基础。无论你是准备面试,还是想要提升编程技能,这...

Global site tag (gtag.js) - Google Analytics