`
晴空之羽
  • 浏览: 8462 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

几种不稳定排序算法

阅读更多
几种常用的不稳定排序算法的整理。
package com.study.sort;

import java.util.Random;

public class UnstableSort {
	/**
	 * 生成一个随机数组
	 * @param length 数组长度
	 * @return 生成的数组
	 */
	public static int[] init(int length){
		int [] before=new int[length];
		Random rand=new Random(47);
		for(int i=0;i<length;i++){
			before[i]=rand.nextInt(100);
		}
		return before;
	}
	
	/**
	 * 选择排序
	 * @param before 待排序数组
	 * @return 排序后数组
	 */
	public static int[] selectSort(int[] before){
		int min;
		for(int i=0;i<before.length-1;i++){
			min=i;
			for(int j=i+1;j<before.length;j++){
				if(before[j]<before[min]){
					int temp=before[j];
					before[j]=before[min];
					before[min]=temp;
				}
			}
		}		
		return before;
	}
		
	/**
	 * 堆排序
	 * @param before 待排序数组
	 * @return 排序后数组
	 */
	public static int[] heapSort(int[] before){
		for(int i=0;i<before.length-1;i++){
			buildMaxHeap(before,before.length-1-i);
			swap(before,0,before.length-1-i);
		}
		return before;
	}
	public static void buildMaxHeap(int[] before,int bound){
		for(int i=(bound-1)/2;i>=0;i--){
			int k=i;
			while(k*2+1<=bound){
				int biggerIndex=2*k+1;
				//比较其左右节点 并保存较大值的下标
				if(biggerIndex<bound){
					if(before[biggerIndex]<before[biggerIndex+1])
						biggerIndex++;
				}
				//比较子节点较大值与自身大小,如果小于,将自身值替换为较大值
				if(before[k]<before[biggerIndex]){
					swap(before,k,biggerIndex);
					k=biggerIndex;
				}else
					break;
			}
		}
	}
	public static void swap(int[] before,int x,int y){
		if(x<before.length&&y<before.length){
			int temp=before[x];
			before[x]=before[y];
			before[y]=temp;
		}
	}
	
	/**
	 * 快排
	 * @param before 待排序数组
	 * @return 排序后数组
	 */
	public static int[] quickSort(int[] before){
		_quickSort(before,0,before.length-1);
		return before;
	}
	public static void _quickSort(int[] before,int low,int high){
		if(low<high){
			int mid=partion(before,low,high);
			_quickSort(before,low,mid-1);
			_quickSort(before,mid+1,high);
		}
	}
	public static int partion(int[] before,int low,int high){
		int temp=before[low];
		while(low<high){
			while(low<high&&before[high]>=temp)
				high--;
			before[low]=before[high];
			while(low<high&&before[low]<=temp)
				low++;
			before[high]=before[low];
		}
		before[low]=temp;
		return low;
	}
	
	/**
	 * 希尔排序(最小增量排序,改进的插入排序) 
	 * @param before
	 * @return
	 */
	public static int[] shellSort(int[] before){
		int size=before.length;
		for(int gap=size/2;gap>=1;gap/=2){
			for(int i=gap;i<size;i++){
				int k;
				int temp=before[i];
				for(k=i-gap;k>=0&&before[k]>temp;k-=gap)
					before[k+gap]=before[k];
				before[k+gap]=temp;
			}
		}
		return before;
	}
	
	/**
	 * 打印数组内容到控制台
	 * @param before 待显示数组
	 */
	public static void prt(int[] before){
		for(int x:before){
			System.out.print(x+"  ");
		}
		System.out.println("");
	}
	
	public static void main(String[] args){
		int[] before=init(10);
		prt(before);
//		selectSort(before);
//		heapSort(before);
//		quickSort(before);
		shellSort(before);
		prt(before);
	}
}

0
0
分享到:
评论

相关推荐

    几种排序算法整理

    本文将深入探讨由C语言实现的几种常见排序算法,包括它们的基本原理、实现细节和性能特点。 首先,让我们从最经典的排序算法——冒泡排序(Bubble Sort)开始。冒泡排序通过不断地交换相邻的不正确顺序的元素来逐步...

    几种常见排序算法代码

    几种常见的排序算法是编程领域中基础且重要的知识点,它们各自有不同的特点和适用场景。本文将详细介绍这些算法,并分析其效率。 一、冒泡排序 冒泡排序是一种简单的排序算法,通过不断交换相邻的两个元素来逐步...

    用Java实现几种常见的排序算法

    希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件...

    最常见的几种排序算法,来看看

    这里我们将深入探讨几种最常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及归并排序。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,它通过不断地比较相邻元素并交换位置来实现...

    数据结构中几种常用的排序算法总结

    3. **稳定性**:稳定排序算法能够保持相同关键字项的原始顺序。这对于处理含有重复关键字的数据集尤为重要。如果排序算法不稳定,则可能导致相同关键字的项之间的相对顺序发生变化。 #### 四、具体的排序算法 ####...

    排序算法的稳定性和时间复杂度小结

    希尔排序是非稳定排序算法。 - **时间复杂度**:希尔排序的时间复杂度取决于所使用的增量序列,一般情况下时间复杂度介于O(n log n)与O(n^(3/2))之间。 - **稳定性**:不稳定。在希尔排序的过程中,相等元素的顺序...

    几种经典的排序算法,源代码

    本文主要介绍了五种经典的排序算法:起泡排序、直接插入排序、简单选择排序、快速排序和堆排序。每种算法都有其适用的场景和特点,理解这些算法有助于优化程序性能。 1. 起泡排序(Bubble Sort): 起泡排序是一种...

    各种排序算法比较

    文档中提到了几种不同排序算法的时间复杂度: - **O(n²)**:插入排序、冒泡排序和选择排序的时间复杂度均为O(n²),这意味着随着数据量的增加,这些算法的执行时间将以平方的速度增长。 - **O(n log₂ n)**:除了...

    几种经典排序算法的实现比较

    归并排序是一种稳定的排序算法,它将大问题分解为小问题,然后逐个解决。归并排序将数组分成两个子数组,分别排序后再合并,其时间复杂度始终为O(n log n)。在处理大量数据时,归并排序表现出良好的性能,但需要...

    用php实现几种常见的排序算法共6页.pdf.zip

    本资料包"用php实现几种常见的排序算法共6页.pdf.zip"聚焦于PHP如何实现几种经典的排序算法,这对于理解数据结构与算法以及提升PHP编程技能至关重要。排序算法是计算机科学中的基础,它们对大量数据进行有序排列,对...

    几种不同排序的比较及其算法

    这里我们将深入探讨几种常见的排序算法,包括插入排序、快速排序以及堆排序,它们各自有其特点和适用场景。 首先,我们来看插入排序(Insertion Sort)。插入排序是一种简单的排序算法,其基本思想是将待排序的数据...

    几种常见排序算法实现

    几种常见排序 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 Insertion...

    Java几种常见的排序算法(经典收藏)

    根据给定的文件信息,我们可以深入探讨几种在Java中实现的经典排序算法,这些算法是数据结构与算法领域的重要组成部分,广泛应用于各种计算机科学场景。以下是对插入排序(Insertion Sort)、冒泡排序(Bubble Sort...

    各种排序算法的稳定性和时间复杂度总结

    以下是对几种常见排序算法的稳定性和时间复杂度的详细分析。 #### 1. 冒泡排序 冒泡排序是一种简单的排序算法,通过重复地遍历待排序的列表,比较每对相邻项,并在必要时交换它们。这一过程会持续进行,直到不再...

    Java几种排序算法

    本文将详细介绍Java中常见的几种排序算法,包括冒泡排序、快速排序以及选择排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它的主要思想是通过不断比较相邻元素并交换位置,使得较大的元素逐渐“浮”到...

    五种排序算法

    在本文中,我们将探讨几种在C++中最常见的排序算法。这五种算法分别是桶排序、快速排序、归并排序、插入排序和qsort函数。每种算法都有其适用场景、优缺点、时间复杂度和空间复杂度。理解这些算法对于提升编程技能和...

Global site tag (gtag.js) - Google Analytics