`

排序 java实现

 
阅读更多
package datastructure;

import java.util.Arrays;

// sort from small to big
public class Sort {

	// 选择排序
	public void selectionSort(int[] array) {
		int length = array.length;
		int tempValue = 0;
		int tempIndex = 0;
		for (int i = 0; i < length - 1; i++) {
			tempValue = array[i];
			tempIndex = i;
			for (int j = i; j < length; j++) {
				if (array[j] < tempValue) {
					tempValue = array[j];
					tempIndex = j;
				}
			}
			array[tempIndex] = array[i];
			array[i] = tempValue;
		}
	}
	// 插入排序
	public void insertSort(int[] array) {
		int tempValue = 0;
		int length = array.length;

		for (int i = 1; i < length; i++) {

			for (int j = 0; j < i; j++) {
				if (array[i] < array[j]) {
					tempValue = array[i];
					for (int k = i; k > j; k--) {
						array[k] = array[k - 1];
					}
					array[j] = tempValue;
				}
			}

		}
	}
	// 冒泡排序
	public void bubbleSort(int[] array) {
		int length = array.length;
		int tempValue = 0;

		for (int i = 0; i < length - 1; i++) {

			for (int j = 0; j < length - i - 1; j++) {
				if (array[j] > array[j + 1]) {
					tempValue = array[j];
					array[j] = array[j + 1];
					array[j + 1] = tempValue;
				}
			}
		}
	}
	
	// 归并排序
	public int[] mergeSort(int[] arrs) {
		if(arrs.length < 2){
			return arrs;
		}
		int middle = arrs.length % 2 == 0 ? arrs.length / 2 : (arrs.length - 1) / 2;
		int[] left = Arrays.copyOfRange(arrs, 0, middle);
		int[] right = Arrays.copyOfRange(arrs, middle, arrs.length);
		int[] lres = mergeSort(left);
		int[] rres = mergeSort(right);
		return merge(lres, rres);
	}
	private int[] merge(int[] lres, int[] rres) {
		int[]  res = new int[lres.length + rres.length];
		int l = 0;
		int r = 0;
		int c = 0;
		while(l < lres.length && r < rres.length){
			if(lres[l] < rres[r]){
				res[c++] = lres[l++];
			} else {
				res[c++] = rres[r++];
			}
		}
		if(l == lres.length){
			while(r < rres.length){
				res[c++] = rres[r++];
			}
			return res;
		}
		if(r == rres.length){
			while(l < lres.length){
				res[c++] = lres[l++];
			}
			return res;
		}
		return res;
	}
	// 快速排序
	public void quickSort(int[] array, int i, int j) {

		if (i < j) {
			
			int start = i;
			int end = j;

			int partition = array[i];
			while (i < j) {

				while (i<j && partition <= array[j]) {
					j--;
				} 
				array[i] = array[j];
				while(i<j && partition >= array[i]){
					i++;
				}
				array[j] = array[i];
			}
			array[i] = partition;

			this.quickSort(array, start, i-1);
			this.quickSort(array, i + 1, end);

		}
	}
	// 堆排序
	public void heapSort(int[] array) {
		this.createHeap(array);
		int heapLength = array.length;
		for (int i=0;i<array.length;i++) {
			
			int temp = array[heapLength-1];
			array[heapLength-1]=array[0] ;
			array[0] = temp;
			heapLength=heapLength-1;
			this.heapifyDown(array, 0, heapLength);
			
		}
	}
	
	private void createHeap(int[]  array){
		int length = array.length;
		for (int i=length/2-1; i>=0; i--) {
			this.heapifyDown(array, i, length);
		}
	}
	// 这里多加一个arraylen的设计,目的是 在  真正做 排序 首尾交换的时候 ,heap size是越来越小的。所以做heapifydown时,不应该考虑整个数组
	private void heapifyDown(int[] array, int i, int arraylen){
		//int length = array.length;
		int length = arraylen;
		if (2*i+2 > length)
			return;
		
		if (2*i+2 == length) {
			if(array[i] > array[length-1]){
				int temp = array[i];
				array[i] = array[length-1];
				array[length-1] = temp;
			}
		} else {	
			int compareIndex;
			if (array[2*i+1]<array[2*i+2])
				compareIndex = 2*i+1;
			else 
				compareIndex = 2*i+2;
			if(array[i] > array[compareIndex]) {
				int temp = array[i];
				array[i] = array[compareIndex];
				array[compareIndex] = temp;
			
				this.heapifyDown(array, compareIndex, length);
			}
		}
		
	}

	public void print(int[] array) {
		int len = array.length;
		for (int i = 0; i < len; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int n = 10;
		int[] array = new int[n];

		for (int i = 0; i < n; i++) {
			array[i] = (int) (Math.random() * 100);
		}

		Sort s = new Sort();
		System.out.println("Before sorting:");
		s.print(array);

		// s.selectionSort(array);
		// s.insertSort(array);
		// s.bubbleSort(array);
		//s.quickSort(array, 0, n - 1);
		//s.heapSort(array);
		s.print(s.mergeSort(array));

		System.out.println("After sorting:");
		s.print(array);

	}
}

 

分享到:
评论

相关推荐

    堆排序 java实现

    堆排序 java实现

    快速排序 java实现

    快速排序 java实现

    DSAA_堆排序java实现_源码

    标题中的“DSAA_堆排序java实现_源码”表明这是一个关于数据结构与算法分析(Data Structures and Algorithms Analysis,简称DSAA)的资料包,主要关注堆排序算法的Java实现。堆排序是一种高效的排序算法,它利用了...

    冒泡排序Java实现.docx

    冒泡排序 Java 实现 冒泡排序是最简单的排序算法之一,它的工作原理是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说...

    java实现归并排序

    Java实现归并排序 Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 ...

    交换排序Java实现

    在编程领域,排序是至关重要的一个部分,尤其是在处理大量数据时。Java作为一种广泛使用的编程语言,提供了多种...在提供的压缩包文件"Demo_4"中,应该包含了具体的Java实现代码,你可以参考并学习这些示例来加深理解。

    八大排序java实现

    八大排序java实现源代码,有非常完整的注释,非常适合初学者。有些排序有多种实现方式我也写了,总之是很好的资料。八大排序:冒泡排序、插入排序、选择排序、归并排序、堆排序、快速排序、希尔排序和基数排序。真的...

    冒泡排序java实现

    冒泡排序是一种基础的排序算法,它通过重复遍历待排序...总的来说,本示例主要展示了冒泡排序的Java实现,通过随机生成的1000个数进行验证,确保了算法的正确性。同时,它也为我们提供了学习和理解其他排序算法的基础。

    基数排序 java实现

    自己写的插入排序,随机产生1000次,每次产生0-1000个数,验证算法正确性。java实现。

    8大排序java实现

    在Java实现中,通过遍历数组,将每个元素与前面已排序的部分进行比较,如果当前元素小于前一个元素,则将其向前移动,直到找到合适的位置插入。这种算法对于部分有序的数据有较好的效率。 2. **希尔排序(Shell ...

    八大排序-java实现版

    八大排序java实现版本,直接插入排序、折半插入排序、冒泡排序、简单选择排序、希尔插入排序、快速排序 、堆排序、2-路归并排序 、基数排序,并有时间比较,博文...

    计数排序JAVA实现counting sort algorithm

    Java实现计数排序的关键步骤如下: 1. **初始化计数数组**:创建一个与待排序数组最大值相等长度的计数数组,所有元素初始化为0。 2. **计数过程**:遍历待排序数组,对于每个元素,将其值作为索引增加计数数组...

    java实现插入排序

    在Java中实现插入排序,主要涉及数组操作和循环控制,我们可以从以下几个方面来理解这个过程。 1. **基本概念** 插入排序在实际操作中类似于打扑克牌,每拿到一张新牌(数组中的元素),就将其插入到已排序的序列...

    外部归并排序Java实现

    Java实现外部归并排序的过程包括以下几个关键步骤: 1. **划分阶段**: - 将原始数据分割成多个小文件,每个文件包含可以一次性加载到内存中的数据量。这通常通过创建一系列的子序列(也称为块或桶)完成。 - 对...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    总的来说,快速排序和折半查找是计算机科学中不可或缺的算法,通过递归和分治策略,可以在Java中高效地实现这些算法,并结合界面设计,为用户提供直观的交互体验。在实际项目中,理解和掌握这些算法有助于优化数据...

    堆排序JAVA实现代码

    以下将详细介绍堆排序的原理、步骤以及Java实现。 **堆排序的原理** 堆排序的核心思想是构建一个完全二叉树,即堆,然后通过调整堆结构,使得根节点(最大元素或最小元素)总能处于正确的位置。这个过程分为两个...

    冒泡排序JAVA实现

    在Java中实现冒泡排序,我们可以按照以下步骤进行: 1. **基本概念**: 冒泡排序的核心思想是重复地走访过要排序的元素列表,依次比较相邻的两个元素,如果它们的顺序(如从小到大、从大到小)错误就把它们交换...

    快速排序Java实现程序

    public static void quicksort(int[] array,int start, int end){ if(start&gt;=end) return; int middle=partition(array,start,end); quicksort(array,start,middle-1); quicksort(array,middle+1,end);...

Global site tag (gtag.js) - Google Analytics