几种常用的不稳定排序算法的整理。
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);
}
}
分享到:
相关推荐
本文将深入探讨由C语言实现的几种常见排序算法,包括它们的基本原理、实现细节和性能特点。 首先,让我们从最经典的排序算法——冒泡排序(Bubble Sort)开始。冒泡排序通过不断地交换相邻的不正确顺序的元素来逐步...
几种常见的排序算法是编程领域中基础且重要的知识点,它们各自有不同的特点和适用场景。本文将详细介绍这些算法,并分析其效率。 一、冒泡排序 冒泡排序是一种简单的排序算法,通过不断交换相邻的两个元素来逐步...
希尔排序是非稳定排序算法。该方法因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如何实现几种经典的排序算法,这对于理解数据结构与算法以及提升PHP编程技能至关重要。排序算法是计算机科学中的基础,它们对大量数据进行有序排列,对...
这里我们将深入探讨几种常见的排序算法,包括插入排序、快速排序以及堆排序,它们各自有其特点和适用场景。 首先,我们来看插入排序(Insertion Sort)。插入排序是一种简单的排序算法,其基本思想是将待排序的数据...
几种常见排序 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 Insertion...
根据给定的文件信息,我们可以深入探讨几种在Java中实现的经典排序算法,这些算法是数据结构与算法领域的重要组成部分,广泛应用于各种计算机科学场景。以下是对插入排序(Insertion Sort)、冒泡排序(Bubble Sort...
以下是对几种常见排序算法的稳定性和时间复杂度的详细分析。 #### 1. 冒泡排序 冒泡排序是一种简单的排序算法,通过重复地遍历待排序的列表,比较每对相邻项,并在必要时交换它们。这一过程会持续进行,直到不再...
本文将详细介绍Java中常见的几种排序算法,包括冒泡排序、快速排序以及选择排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它的主要思想是通过不断比较相邻元素并交换位置,使得较大的元素逐渐“浮”到...
在本文中,我们将探讨几种在C++中最常见的排序算法。这五种算法分别是桶排序、快速排序、归并排序、插入排序和qsort函数。每种算法都有其适用场景、优缺点、时间复杂度和空间复杂度。理解这些算法对于提升编程技能和...