package com;
public class Sort {
private static int[] list = {7,3,4,1,9,2,8,5,6,0,5};
/**
* 冒泡排序, O(n^2)
*/
private static void bubble(){
for (int i = 0; i< list.length ; i++){
for (int j= 0; j< list.length -i -1; j++){
if (list[j] > list[j+1]){
int tmp = list[j];
list[j] = list[j+1];
list[j+1] = tmp;
}
}
}
}
/**
* 简单选择排序, O(n^2)
* 将要排序的对象分成两部分,一部分是已排序的,一部分是未排序的,从未排序的部分选择最小的,并放入已排序部分的最后一个
*/
private static void selection(){
for (int i = 0; i< list.length; i++){
int position = i;
for (int j =i + 1; j< list.length; j++){
if (list[position] > list[j]){
position = j;
}
}
int tmp = list[i];
list[i] = list[position];
list[position] = tmp;
}
}
/**
* 直接插入排序, O(n^2)
* 将数据分为两部分,从后面部分依次取出数据,插入前面部分(插入后的前面这部分有序)
*/
private static void insertion(){
for (int i=1; i<list.length; i++){
int j = i -1 ;
int tmp = list[i];
while(list[j] > tmp){
list[j+1] = list[j];
j--;
if (j<0) break;
}
list [j+1] = tmp ;
}
}
/**
* 快速排序, O(n*log n)
* 属于一种优化冒泡排序
* 定义一个枢轴,使得在其之前的都小于它之后的都大于等于它,然后按这个法则在枢轴两边递归运算;枢轴一般取第一个元素
*/
private static void quickSort(int low, int high){
if (low < high){
int p = partition(low,high);
quickSort(low, p-1);
quickSort(p+1, high);
}
}
/**
* 将序列划分为2个子序列,并返回枢轴元素位置;其中,枢轴元素前的元素都小于枢轴元素,后的都大于枢轴元素
*/
private static int partition(int low, int high){
int pivot = list[low];
while(low < high){
while(low < high && list[high] >= pivot) high --;
list[low] = list[high];
while(low < high && list[low] <= pivot) low ++;
list[high] = list[low];
}
list[low] = pivot;
return low;
}
/**
* 希尔排序,又称“缩小增量排序”,是改进的直接插入排序方式
* 时间复杂度依赖于步长序列,如当步长序列为delta[k]=2^(t-k+1) - 1,时间复杂度O(n^1.5)
* 本例,我们选择步长序列为:{5,3,1}
*/
private static void shell(){
int[] step = {5,3,1};
for (int i:step)
shellInsert(i);
}
private static void shellInsert(int deltaK){
for (int i=deltaK; i<list.length; i++){
if (list[i]<list[i-deltaK]){
int tmp = list[i];
int j = i - deltaK;
for (;j>=0 && tmp < list[j]; j-=deltaK ){
list[j + deltaK] = list[j];
}
list[j+deltaK] = tmp ;
}
}
}
public static void main(String[] args) {
bubble();
// selection();
// insertion();
// quickSort(0, list.length -1);
// shell();
for (int x:list)
System.out.print(x+" ");
}
}
分享到:
相关推荐
在IT领域,排序算法是计算机科学中的基础但至关重要的概念,尤其在数据处理和算法设计中扮演着核心角色。本文将深入探讨标题中提到的几种基于比较的排序算法:选择排序、插入排序、归并排序、快速排序、堆排序、冒泡...
最快的排序算法 最快的内部排序法—桶排序法,排序算法数据结构
常见的经典排序算法有希尔排序、二分插入法、直接插入法、带哨兵的直接排序法、冒泡排序、选择排序、快速排序、堆排序等。 一、希尔排序(Shell 排序法) 希尔排序法,又称宿小增量排序,是 1959 年由 D.L.Shell ...
最快的排序算法 最快的内部排序法—桶排序法 (1),排序算法数据结构
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
内容概要:本文档全面解析了堆排序这一基于比较的经典排序算法。文中详细解释了堆的概念及其特性,阐述了堆排序算法的两个关键步骤——建堆(Heapify)与排序,并提供了具体的 Java 实现代码。在建堆阶段,文档介绍...
上次的改进,审核求过.
常见10大算法,从原理,动图解析到代码实现,逐步分析,让你轻松入门算法
在编程领域,排序算法是计算机科学中的重要组成部分,特别是在数据处理和算法效率分析上。本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年...
希尔排序,冒泡排序、快速排序递归排序,快速排序非递归排序,快速排序改进算法
六种排序算法的排序系统 本篇文章主要讲解了六种排序算法的排序系统,包括插入排序、冒泡排序、选择排序、快速排序、堆排序和归并排序。该系统可以让用户选择六种排序算法中的任意一个,并输出结果。 插入排序 ...
算法课的一个小项目,语言python。代码实习7种排序算法,TK实现简单GUI,源码可以学习7中排序算法详细实现,和GUI的搭建,基本包含了常用GUI组件。
摘要:VB源码,算法相关,排序算法 七种常见的VB排序算法示例程序,演示了冒泡排序法、插入排序法、Bucket排序法、选择排序法、Shell排序法、快速排序法、Heap排序法这7种常见的VB排序算法示例,选择对应算法,可能...
此为一个利用Java语言编写的排序分析程序,程序中统计了各种排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序、基数排序)的分析,ppt中包含各种排序算法的分析,附上动画演示(来自...
冒泡排序
在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。本资源"MoreWindows白话经典算法之七大排序(高清版).pdf"提供了一套详尽的排序算法讲解,...
排序算法是一种将一组数据按照一定的顺序进行排列的算法,目的在于使数据有序化,进而便于检索和处理。排序可以分为内部排序和外部排序两大类,这两类排序方法在处理数据时所用的存储介质和策略有所不同。 内部排序...
使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连。所有处理器可同时与邻居进行比较、交换操作,交替以奇-偶、偶-奇的顺序...
排序算法是计算机科学中的核心概念,它涉及到如何有效地组织数据,以便快速地访问或操作。在本"排序算法演示程序"中,用户可以在Windows平台上直观地观察和理解各种排序算法的工作原理。通过运行sound-of-sorting-...
### 排序算法分析 #### 实验目的 本次实验旨在深入了解和掌握几种常见的排序算法,包括选择排序、冒泡排序、合并排序、快速排序以及插入排序。通过编程实现这些算法并进行性能分析,来理解不同算法的特点及其适用...