`

数组相关知识(包括各种常见的排序原理及其实现,冒泡排序、交换排序、快速排序)

    博客分类:
  • java
阅读更多
jdk为我们提供了一个辅助功能的类java,util.Arrays,这个类专门用于帮助我们完成一些数组的相关的一些方法的判断,比如数组的比较(比较各种数据类型的两个数组里面存放的内容是否相等)、排序、查询...之类的,这个类里面提供的所有方法全都是static的。
例如:比较两个数组的内容是否相同:
		int[] c = new int[]{1,2,3};
		int[] d = new int[]{1,2,3};
		System.out.println(Arrays.equals(c,d));



System类是java.util包里面的一个类,其中有这样一个方法:
public static void arraycopy(Object src,
                             int srcPos,
                             Object dest,
                             int destPos,
                             int length)

src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。

这个方法可以复制数组,将一个数组里面的内容复制到另一个数组里面。


【说明】:System.out.println(a instanceof Object);为真,说明数组a也是一个对象。

System.out.println(a instanceof int[][][]);为真,说明数组a是一个三维数组,类型是int[][][]。
System.out.println(a[0] instanceof int[][]);为真,说明数组a[0]是一个二维数组,类型是int[][]。
System.out.println(a[0][0] instanceof int[]);为真,说明数组a[0][0]是一个一维数组,类型是int[]。




下面一个小的知识点:数组是一个对象,
		int[][] arr = new int[2][3];
		if (arr instanceof int[][]) {
			System.out.print(123);
		}
		if (arr[0] instanceof int[]) {
			System.out.print(456);
		}

打印结果为123456,两个判断都为真。

时常熟悉下下面这些代码:
		int[][] a = new int[][] { { 1, 2, 3 }, { 4 }, { 5, 6, 7, 8 } };

		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				System.out.print(a[i][j] + " ");
			}
			System.out.println();
		}

		char[] ch = { 'A', 'C' };
		swap(ch, ch[1]);
		for (int i = 0; i < ch.length; i++) {
			System.out.println(ch[i]);
		}

		System.out
				.println(compare(new int[] { 1, 2, 3 }, new int[] { 1, 2, 3 }));

		System.out.println("------------------------------------");
		int[] c = new int[] { 1, 2, 3 };
		int[] d = new int[] { 1, 2, 3 };
		System.out.println(Arrays.equals(c, d));

		System.out.println("-------------------------------------");
		int[] aa = new int[] { 1, 2, 3, 4 };
		int[] bb = new int[4];
		System.arraycopy(aa, 0, bb, 0, 4);
		for (int i = 0; i < bb.length; i++) {
			System.out.println(bb[i]);
		}



下面讲解冒泡排序:
原理:比如想要升序排列,对数组里面的数字相邻的两两进行比较,如果前面的数大,他们两个就交换位置,否则不变,继续执行,循环完第一轮之后最大的数就到最后一个了,接下来开始第二轮,第二轮之后第二大的数据也到了倒数第二个位置了,第三轮之后第三大的数据也到了倒数第三大位置了.....,下面举一个例子:
对5,4,7,9,3这一组数据按照从大到小进行排序:
第一轮:45793;
       45793;
       45793;
       45739;
第二轮:......
       45379;
第三轮:......
       43579;
第四轮:......
       34579;


代码如下:
	/**
	 * 冒泡排序(对一个数组里的数据进行升序排列)
	 * 方法: sort <br>
	 * 描述: TODO <br>
	 * 作者: 
	 * 时间: 
	 * @param a
	 * @return
	 */
	public static int[] sort(int[] a) {
		// 数组里面有length个数就循环(length-1)轮,每轮完成之后从后向前依次得到一个最大数,循环到最后一个数就不用循环了,因为只剩一个数了,它肯定是排在第一位的最小的数,所以循环(length-1)轮
		for (int i = 0; i < (a.length - 1); i++) {
			// 这里循环(a.length - 1 - i)次,进行相邻的两数之间的比较,并且对不符合升序的组合互换位置,而前面已经从后向前依次得到了(i+1)个最大数,所以后面已经确定的数就不用再进行两两比较了。
			for (int j = 0; j < (a.length - 1 - i); j++) {
				if (a[j] > a[j + 1]) {
					int demp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = demp;
				} else {
					continue;
				}
			}
		}
		return a;
	}


另外:很多人针对冒泡排序提出一个更高效率的小的改进,原理是,如果第一趟比较完之后,发现没有交换数据的动作,说明这个数组本身就是有序的,就不需要做下面的比较了,直接跳出循环结束即可。代码里的修改,只需在if里面加一个boolean类型的标志位,然后根据此标志位判断第一趟执行完之后有没有交换数据的动作,如果没有就直接跳出循环结束排序即可,如果有就按正常情况执行下面多趟的比较、交换数据等操纵。

交换排序是一个大的类,冒泡排序和快速排序都属于交换排序。


还有其他算法,见iteye博客文章:“快速排序算法”,“二分查找法”
分享到:
评论

相关推荐

    冒泡排序 算法(冒泡,选择,插入,数组排序)

    冒泡排序的实现包括两个嵌套的循环。外层循环控制整个排序过程,内层循环则负责比较并交换相邻的元素。`for(int i=0;i;i++)` 是外层循环,`for(int j=i+1;j;j++)` 是内层循环。当`a[i] &gt; a[j]`时,说明当前元素需要...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...

    合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现

    本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...

    c语言二维数组冒泡排序

    首先,我们要理解冒泡排序的基本原理。冒泡排序的工作方式是通过比较相邻元素并根据需要交换它们的位置,使得每一轮遍历后,最大(或最小)的元素“浮”到数组的一端。这个过程会反复进行,直到整个数组排序完成。...

    JAVA快速,选择,冒泡数组排序

    在编程领域,数组排序是常见的任务之一,尤其是在处理大量数据时。Java作为一种广泛使用的编程语言,提供了多种排序算法供开发者选择。本主题将详细介绍三种基本的排序算法:快速排序、选择排序和冒泡排序,以及它们...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序源码实现

    以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    java 冒泡排序 数组冒泡排序

    冒泡排序是一种基础且经典的排序算法,它通过不断交换相邻两个元素的位置,使得每一次遍历都能将当前未排序部分的最大(或最小)元素“冒”到已排序部分的末尾。在Java编程语言中,我们可以很容易地实现这个算法。...

    数组排序中的(选择,冒泡)

    在IT行业中,数组排序是一个基础且重要的概念,广泛应用于数据处理和算法实现。本文将深入探讨两种常见的排序算法——选择排序和冒泡排序,并结合给定的文件信息进行解析。 首先,选择排序是一种简单直观的排序算法...

    java各种数组排序

    根据给定文件的信息,本文将详细介绍Java中几种常见的数组排序算法,包括插入排序、交换排序、选择排序、归并排序以及基数排序等,并探讨不同排序方法的应用场景。 ### 一、插入排序 #### 1. 直接插入排序 直接...

    js实现数组冒泡排序、快速排序原理

    在JavaScript中,数组排序是常见的数据处理操作,主要分为两种基本算法:冒泡排序和快速排序。这两种排序方法各有特点,适用于不同的场景。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,它重复地遍历待排序...

    快速排序算法和冒泡排序效率对比

    快速排序和冒泡排序是两种常见的排序算法,它们在计算机科学中扮演着重要的角色,特别是在数据处理和优化程序性能方面。本篇文章将深入探讨这两种排序算法的原理、效率以及它们在C#编程语言中的实现。 首先,让我们...

    交换类排序(内有经典的冒泡排序和快速排序C++代码实现)

    在本主题中,我们将深入探讨两种典型的交换排序方法:冒泡排序和快速排序。 **冒泡排序** 是最基础的交换排序之一,其名字来源于排序过程中元素像气泡一样逐渐上升到顶部。冒泡排序的工作原理是反复遍历待排序的...

    冒泡排序和快速排序的时间性能

    冒泡排序和快速排序的时间性能 冒泡排序和快速排序是两种常用的排序算法,它们的时间性能是开发者和研究人员所关心的热点话题。在本文中,我们将对冒泡排序和快速排序的时间性能进行深入分析和比较。 冒泡排序是一...

    随机数排序_20个随机数_数组排序_源码

    以上就是针对"随机数排序_20个随机数_数组排序_源码"这一主题的关键知识点,涵盖了随机数生成、数组操作、排序算法及其性能、源码分析等方面。理解这些概念对于提升编程技能和解决问题能力非常有帮助。

    易语言数组排序算法集合

    易语言是一种专为中国人设计的编程语言,它以简明的中文语法,使得初学者能够更容易地学习编程...易语言数组排序算法集合中的源代码提供了直观的学习材料,有助于理解各种排序算法的实现原理,并在实际编程中灵活运用。

    经典排序算法,有选择排序,冒泡排序,交换排序,谢尔排序,插入排序基数排序

    根据给定的文件信息,我们将深入探讨几种经典的排序算法,包括选择排序、冒泡排序、交换排序、希尔排序、插入排序以及基数排序。这些算法在计算机科学领域内有着广泛的应用,各自具有独特的特点和适用场景。 ### 1....

    基于C++冒泡排序法

    C++是广泛应用于系统编程、应用编程、游戏开发等多个领域的强大编程语言,因此用C++实现冒泡排序是常见的实践练习。 冒泡排序的工作原理基于比较和交换相邻元素的过程。它重复地遍历待排序的数列,一次比较两个元素...

Global site tag (gtag.js) - Google Analytics