`
zhongkem
  • 浏览: 151514 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

java排序算法自己总结版本

阅读更多

 差不多开始要找工作了,因此今天特意对排序算法进行了复习,把一些心得记录下来。先给出各种算法的原理和实现,最后再做些总结吧。

1.冒泡排序,这个应该是大家都熟悉的。(都是从小到大排)

原理:简单理解就是依次把最小的数往上冒。

	public void bubbleSort(int[] data) {

		//较小的数往前冒,每一次外层循环,保证第i个数是第i大的
			for(int i=0;i<data.length;i++){
				for(int j=i+1;j<data.length;j++){
					//如果后面有比data[i]小的,就交换过来
					if(data[i]>data[j])
						swap(data, i, j);
				}				
			}

 其中的swap方法表示交换数组中两个位置的数据,代码如下:

private void swap(int[] data, int x, int y) {

		int temp = data[x];

		data[x] = data[y];

		data[y] = temp;

	}

 

2.选择排序

个人感觉可以看作是冒泡排序方法的改进版。冒泡排序是只要后面的比当前的小就交换,而选择排序是从后面没排好的找到最小值的位置,最后只需要交换一次。

	public void selectSort(int[] data) {
			int index;//当前最小值的位置
			for(int i=0;i<data.length;i++){
				index=i;
				for(int j=i+1;j<data.length;j++){
					if(data[index]>data[j]){
						index=j;//记录最小位置
					}
				}
				swap(data, i, index);//把当前最小值保存到第i个位置
			}
	}

 3.插入排序

这种方法的思路是,将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表。也就是说程序开始把第一个数当作一个有序表,然后依次加入后面的n-1个数,每加入一个数,都要保证得到的序列是排好序的。

public void insertSort(int[] data) {
		for (int i = 1; i < data.length; i++) {
			// 把第i个位置的数插到前i-1个数的某个位置,保证前i个数排好序
			int temp = data[i];// 首先保存第i个数的值
			int j;
			for (j = i; j > 0; j--) {

				if (data[j - 1] > temp)// 如果前面的数比第i个位置的数大,说明得往后移
					data[j] = data[j - 1];
				else
					break;
			}
			data[j] = temp;// 找到合适位置后,插入即可
		}
	}

 4.快速排序

    从数组中随意找出一个数(这里取数组的第一个数),将大于和小于它的数分置于其两边,然后再将其两边的数组都以同样的方法执行 .主要分三步:1) 从数列中挑出一个元素,称为 "基准"(pivot) 2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,这个称为分割(partition)操作。3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

private void quickSort(int data[], int low, int high) {

		int i, j, pivot;
		i = low;
		j = high;
		if (low < high) {// 通过这个条件结束循环
			// 第一步,选择基准,这里就选择第一个数
			pivot = data[i];
			//第二步,通过下面这个循环,把数组中小于基准的放到数组左边,大于基准的放到数组右边
			while (i < j) {
				// 1.从右往左找到第一个小于pivot的元素
				while (i < j && data[j] > pivot)
					j--;
				if (i < j) {
					data[i] = data[j];// 第i个元素保存右边第一个小于pivot的
					i++;
				}
				//2.从左往右找,找到第一个大于pivot的元素
				while (i < j && data[i] < pivot)
					i++;
				if (i < j) {
					data[j] = data[i];// 第j个元素保存左边第一个大于pivot的
					j--;
				}
			}
			data[i] = pivot;//第i个位置就是基准的位置
			//第三步,递归调用该算法,把基准左边,右边的分别排序
			quickSort(data, low, i - 1);
			quickSort(data, i + 1, high);

		}
	}

 5.希尔排序(shell)缩小增量排序

      Shell排序法是对相邻指定距离(称为间隔)的元素进行比较,直到使用当前间隔进行比较的元素都按顺序排序为止.Shell把间隔缩小一半,然后继续处理,当间隔最终变为1,并且不再出现变化时,Shell排序也就完成了其处理过程.实际上就是根据增量把数组分成几部分,每部分进行插入排序即可。个人理解对每个部分的排序可以采取任何的简单排序方法。

public void shellSort(int[] data) {
		//这里把增量初始化为数组长度的一半,然后依次减半,当然也可以传进一个增量数组
		for (int inc = data.length / 2; inc > 2; inc /= 2) {
			for (int j = 0; j < inc; j++) {
				shellInsertSort(data, j, inc);//每一组内进行插入排序
			}
		}
		shellInsertSort(data, 0, 1);//最后进行一次所有元素的排序
	}

	//这个算法其实就是一次插入排序,只不过有个增量inc
	private void shellInsertSort(int[] data, int start, int inc) {
		int temp;
		for (int i = start+inc; i < data.length; i+=inc) {
			// 把第i个位置的数插到前i-1个数的某个位置,保证前i个数排好序
			temp = data[i];// 首先保存第i个数的值
			int j;
			for (j = i; j >=inc; j-=inc) {

				if (data[j - inc] > temp)// 如果前面的数比第i个位置的数大,说明得往后移
					data[j] = data[j - inc];
				else
					break;
			}
			data[j] = temp;// 找到合适位置后,插入即可
		}
	}

 

从代码中可以看出,组内的排序方法和前面讲过的插入排序完全一样。 

6.归并排序

算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归并排序,完成后把这两个子部分合并成一个
序列。
归并排序借助一个全局性临时数组来方便对子序列的归并,该算法核心在于归并。

/** 
	 * @param data 是需要排序的原数组
	 * @param temp 是个临时数组,数组大小和data一样
	 * @param left 左边界
	 * @param right 右边界
	 */
	private void mergeSort(int[] data, int[] temp, int left, int right) {
		
		if (left >= right)//就剩一个元素时,直接返回,直接合并就行了。
			return;
		
		int mid = (left + right) / 2;//获得数组的中间位置
		mergeSort(data, temp, left, mid);//对左半部分递归调用排序算法
		mergeSort(data, temp, mid + 1, right);//对右半部分分递归
		
		//这一步是把原数组中的值保存到临时数组中
		for (int i = left; i <= right; i++) {			
			temp[i] = data[i];
		}
		
		//下面是完成合并,也就是把左右两个有序的数组合并到一个数组中,并使之有序
		int l= left;
		int r = mid + 1;
		for (int cur = left; cur <= right; cur++) {
			if (l == mid + 1)//如果第一个数组已经全部比较完了,那么我们只要直接复制第二个数组的条目到合并数组中即可
				data[cur] = temp[r++];
			else if (r > right)//如果第二个数组已经全部比较完了,那么我们只要直接复制第一个数组的条目到合并数组中即可
				data[cur] = temp[l++];
			else if (temp[l] < temp[r])//把比较的两个条目中关键值小的放到合并数组中
				data[cur] = temp[l++];
			else
				data[cur] = temp[r++];
		}
	}

 

7、堆排序 

分享到:
评论

相关推荐

    java版本排序算法

    ### Java版本排序算法详解 #### 插入排序 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在Java中,我们可以创建一个`...

    Java排序算法实现

    Java排序算法实现 Java排序算法实现 Java排序算法实现

    Java排序算法大全

    Java排序算法大全是一份专为Java开发者准备的学习资源,涵盖了各种经典的排序算法,旨在帮助初学者和有经验的程序员深入理解排序的原理和实现。排序是计算机科学中的基础且重要的概念,它在数据处理、数据库操作、...

    java各种排序算法总结

    排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际...

    java排序算法插入选择冒泡

    java排序算法java排序算法插入选择冒泡java排序算法插入选择冒泡

    各种排序算法比较(java实现)

    本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...

    java排序算法总结

    本文将对Java中的九种基本排序算法进行深入的总结和探讨,包括它们的工作原理、优缺点以及适用场景。 首先,我们来看堆排序(HeapSort)。堆排序是一种基于比较的排序算法,它利用了完全二叉树的特性,通过构建最大...

    JAVA排序算法总结

    ### JAVA排序算法总结 在计算机科学领域,排序算法是数据处理和分析中极其重要的组成部分,尤其是在使用Java语言进行开发时。本文将针对常用的几种排序算法进行详细的总结与解析,包括它们的基本原理、时间复杂度、...

    Java排序算法代码

    根据提供的文件信息,我们可以总结出以下几个关键的排序算法知识点: ### 1. 插入排序 (Insertion Sort) 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后...

    java四大排序算法总结.zip

    Java作为广泛应用的编程语言,其对排序算法的支持使得开发者能够高效地处理大量数据。本篇文章将详细探讨Java中冒泡排序、选择排序、快速排序以及插入排序这四大基本排序算法,并结合代码和动画演示来帮助理解它们的...

    JAVA排序汇总 java应用中一些比较经典的排序算法

    【JAVA排序汇总】Java编程语言中,排序是数据处理中非常基础且重要的操作。本文将对几种经典的排序算法进行简要介绍和分析。 1. **插入排序**: 插入排序分为直接插入排序和折半插入排序。直接插入排序是将每个...

    常用排序算法总结(含Java代码)

    冒泡排序和快速排序是两种基础但广泛使用的数据排序算法。冒泡排序由于其简单直观的特性,易于理解和实现,而快速排序则以其较高的效率在数据量较大时展现出优势。 首先,让我们来看冒泡排序算法。冒泡排序通过重复...

    java 各种排序总结

    【Java排序算法总结】 在Java编程中,排序是常见的数据处理任务,涉及到各种不同的算法,每种算法有其特定的适用场景和性能特点。本文主要介绍几种常见的排序算法及其在Java中的实现。 1. **插入排序** - **直接...

    Java各种排序算法代码.zip

    这个名为"Java各种排序算法代码.zip"的压缩包包含了一系列实现不同排序算法的Java源代码。排序算法是计算机科学中的基本概念,用于对一组数据进行排列。下面将详细讨论这些算法及其在Java中的实现。 1. 冒泡排序...

    java-排序算法总结

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理大量数据。本篇将深入探讨Java中实现的几种...

    Java排序算法详细整理

    【Java排序算法详细整理】 在计算机科学中,排序算法是用于对一组数据进行排列的算法。在Java中,实现各种排序算法有助于理解数据结构和算法的原理,同时也能提高编程能力。以下是对Java中常见的几种排序算法的详细...

    Java各种排序算法代码.

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理数据。本资源包含的是Java实现的各种常见排序...

    Java排序算法源代码

    本资源“Java排序算法源代码”提供了一系列经典的排序算法实现,包括冒泡排序、插入排序、选择排序、希尔排序和快速排序,全部用Java语言编写。这些算法对于学习和理解排序原理以及优化代码性能至关重要。 1. **...

    Java各种排序算法代码

    在编程领域,排序算法是计算机科学中的核心概念,尤其是在Java这样的高级编程语言中。Java提供了丰富的内置库函数,如Arrays.sort(),可以方便地对数组进行排序。然而,理解并掌握各种排序算法对于优化程序性能、...

Global site tag (gtag.js) - Google Analytics