`
sunting_bcwl
  • 浏览: 96957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

七种排序算法 Java版

阅读更多
package com.kevin;

/**
* 七种排序算法Java版,为了简便,用的都是int数组
* 冒泡排序、简单选择排序、插入排序、快速排序、希尔排序、归并排序、堆排序
*
* @author Kevin Alps
*
*/
public class Sort {

/**
* 打印数组
*
* @param data
*/
public static void displayData(int[] data) {
for (int d : data) {
System.out.print(d + " ");
}
System.out.println();
}

/**
* 冒泡排序算法,时间复杂度O(n2),算法具有稳定性,堆排序和快速排序算法不具有稳定性,即排序后相同元素的顺序会发生变化
*
* @param src
*/
public static void bubbleSort(int[] src) {
if (src.length > 0) {
int length = src.length;
for (int i = 1; i < length; i++) {
for (int j = 0; j < length - i; j++) {
if (src[j] > src[j + 1]) {
int temp = src[j];
src[j] = src[j + 1];
src[j + 1] = temp;
}
}
}
}
}

/**
* 快速排序,时间复杂度O(nlogn),最坏时间复杂度O(n2),平均时间复杂度O(nlogn),算法不具稳定性
*
* @param src
* @param begin
* @param end
*/
public static void quickSort(int[] src, int begin, int end) {
if (begin < end) {
int key = src[begin];
int i = begin;
int j = end;

while (i < j) {
while (i < j && src[j] > key) {
j--;
}
if (i < j) {
src[i] = src[j];
i++;
}
while (i < j && src[i] < key) {
i++;
}
if (i < j) {
src[j] = src[i];
j--;
}
}

src[i] = key;

quickSort(src, begin, i - 1);
quickSort(src, i + 1, end);
}

}

/**
* 选择排序,分为简单选择排序、树形选择排序(锦标赛排序)、堆排序 此算法为简单选择排序
*
* @param a
*/
public static void selectSort(int[] a) {
int length = a.length;
for (int i = 0; i < length; i++) {
int minIndex = i;

for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}

if (minIndex != i) {
int temp = a[minIndex];
a[minIndex] = a[i];
a[i] = temp;
}
}
}

/**
* 插入排序,适用于少量数据的排序,时间复杂度O(n2),是稳定的排序算法,原地排序
*
* @param a
*/
public static void insertSort(int[] a) {
int length = a.length;

for (int i = 1; i < length; i++) {
int temp = a[i];
int j = i;
for (; j > 0 && a[j - 1] > temp; j--) {
a[j] = a[j - 1];
}
a[j] = temp;
}
}

/**
* 归并排序算法,稳定排序,非原地排序,空间复杂度O(n),时间复杂度O(nlogn)
*
* @param a
* @param low
* @param high
*/
public static void mergeSort(int a[], int low, int high) {
if (low < high) {
mergeSort(a, low, (low + high) / 2);
mergeSort(a, (low + high) / 2 + 1, high);
merge(a, low, (high + low) / 2, high);
}
}

/**
* 归并排序辅助方法,合并
*
* @param a
* @param low
* @param mid
* @param high
*/
private static void merge(int[] a, int low, int mid, int high) {
int[] b = new int[high - low + 1];
int s = low;
int t = mid + 1;
int k = 0;
while (s <= mid && t <= high) {
if (a[s] <= a[t])
b[k++] = a[s++];
else
b[k++] = a[t++];
}
while (s <= mid)
b[k++] = a[s++];
while (t <= high)
b[k++] = a[t++];
for (int i = 0; i < b.length; i++) {
a[low + i] = b[i];
}
}

/**
* 希尔排序的一种实现方法
*
* @param a
*/
public static void shellSort(int[] a) {
int temp;
for (int k = a.length / 2; k > 0; k /= 2) {
for (int i = k; i < a.length; i++) {
for (int j = i; j >= k; j -= k) {
if (a[j - k] > a[j]) {
temp = a[j - k];
a[j - k] = a[j];
a[j] = temp;
}
}
}
}
}

/**
* 堆排序,最坏时间复杂度O(nlog2n),平均性能接近于最坏性能。由于建初始堆所需的比较次数多,故堆不适合记录较少的比较 堆排序为原地不稳定排序
*
* @param array
*/
public static void heapSort(int[] array) {
for (int i = 1; i < array.length; i++) {
makeHeap(array, i);
}

for (int i = array.length - 1; i > 0; i--) {
int temp = array[i];
array[i] = array[0];
array[0] = temp;
rebuildHeap(array, i);
}
}

/**
* 堆排序辅助方法---创建堆
*
* @param array
* @param k
*/
private static void makeHeap(int[] array, int k) {
int current = k;
while (current > 0 && array[current] > array[(current - 1) / 2]) {
int temp = array[current];
array[current] = array[(current - 1) / 2];
array[(current - 1) / 2] = temp;
current = (current - 1) / 2;
}

}

/**
* 堆排序辅助方法---堆的根元素已删除,末尾元素已移到根位置,开始重建
*
* @param array
* @param size
*/
private static void rebuildHeap(int[] array, int size) {
int currentIndex = 0;
int right = currentIndex * 2 + 2;
int left = currentIndex * 2 + 1;
int maxIndex = currentIndex;
boolean isHeap = false;
while (!isHeap) {
if (left < size && array[currentIndex] < array[left]) {
maxIndex = left;
}
if (right < size && array[maxIndex] < array[right]) {
maxIndex = right;
}
if (currentIndex == maxIndex) {
isHeap = true;
} else {
int temp = array[currentIndex];
array[currentIndex] = array[maxIndex];
array[maxIndex] = temp;
currentIndex = maxIndex;
right = currentIndex * 2 + 2;
left = currentIndex * 2 + 1;
}
}
}

public static void main(String[] args) {
int data[] = { 2, -1, 5, 4, 6, 8, 7, -3 };
Sort.displayData(data);

Sort.bubbleSort(data);
Sort.displayData(data);
}

}
分享到:
评论

相关推荐

    七种排序算法Java版

    七种排序算法Java版 以下是对七种排序算法Java版的详细解释: 1. 冒泡排序 冒泡排序是一种简单的排序算法,时间复杂度为O(n2),算法具有稳定性。冒泡排序的基本思想是:通过对数组的多次遍历,逐渐将最大(或最小...

    七种排序算法Java版.pdf

    七种排序算法Java版 在计算机科学中,排序算法是指将一组数据按照一定的顺序排列的算法。常见的排序算法有冒泡排序、选择排序、快速排序、插入排序、希尔排序、归并排序、堆排序等。下面是七种排序算法的Java实现...

    七种排序算法Java版.doc

    本篇文章主要探讨了七种经典的排序算法的Java实现,包括冒泡排序、选择排序、快速排序、插入排序、希尔排序、归并排序和堆排序。 1. **冒泡排序**: 冒泡排序是一种简单的交换排序,它通过重复遍历待排序的列表,...

    七种排序算法Java版性能比较+Java实现.doc

    本文将详细分析七种常见的Java排序算法:冒泡排序、选择排序、快速排序、插入排序、希尔排序、归并排序和堆排序,并探讨它们在不同条件下的性能表现。 1. **冒泡排序**: - 时间复杂度:平均和最坏情况下都是O(n^2...

    常见的七大排序算法Java实现.zip

    本压缩包"常见的七大排序算法Java实现.zip"包含了七种经典的排序算法在Java语言中的实现。尽管文件列表中并未明确列出每种排序算法的名称,但根据常规,这七大排序算法可能包括冒泡排序、插入排序、选择排序、快速...

    Java 七种排序算法实现

    本资源包含了七种经典的排序算法实现,它们分别是冒泡排序、插入排序、递归排序(这里可能是指归并排序)、基数排序、快速排序、选择排序和希尔排序。下面我们将详细探讨这些排序算法的工作原理和实现方式。 1. **...

    Java版七种排序算法代码大全

    本文将详细探讨Java实现的七种经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序和堆排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,它通过重复遍历待排序的数列,一次...

    常用排序算法java演示

    本文将深入探讨标题"常用排序算法java演示"中涉及的知识点,包括排序算法的原理、Java实现方式以及其在实际应用中的图形演示。 首先,让我们逐一了解几种常见的排序算法: 1. **冒泡排序(Bubble Sort)**:这是一...

    java排序算法

    本文将深入探讨Java中常见的几种基本排序算法,包括插入排序、交换排序、选择排序以及归并排序,并分析它们的基本思想、时间复杂度以及应用场景。 #### 插入排序 插入排序是一种简单的排序方法,它的工作原理类似...

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

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

    各种排序算法java实现

    在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...

    堆排序算法 java

    堆排序算法 java

    Java版七种排序算法.pdf

    Java 版七种排序算法详解 Java 版七种排序算法是计算机科学中的一种基本算法,用于对数据进行排序。排序算法的时间复杂度和空间复杂度是评估其性能的重要指标。本文将对七种常用的排序算法进行详细的介绍,包括冒泡...

    三种排序算法java实现

    这里我们主要关注三种排序算法的Java实现:快速排序、桶排序以及插入排序。这三种算法各有特点,适用于不同的场景。 首先,快速排序(QuickSort)是由C.A.R. Hoare在1960年提出的,它是一种分治策略的典型应用。...

    各种排序算法java源代码

    本资源提供了Java语言实现的五种经典排序算法:冒泡排序、快速排序、插入排序、选择排序以及测试程序。下面将详细介绍这四种排序算法的原理、特点以及Java实现的关键点。 1. **冒泡排序**: 冒泡排序是一种简单...

    8种排序算法的可视化 采用java gui的形式展示

    8种排序算法的可视化 采用java gui的形式展示8种排序算法的可视化 采用java gui的形式展示8种排序算法的可视化 采用java gui的形式展示8种排序算法的可视化 采用java gui的形式展示8种排序算法的可视化 采用java gui...

    java的两种冒泡排序算法

    ### Java中的两种冒泡排序算法 #### 知识点一:基本冒泡排序算法 冒泡排序是一种简单的排序算法,其基本思想是通过不断地比较相邻元素的大小,并根据需要进行交换,来达到排序的目的。 **代码实现:** ```java ...

Global site tag (gtag.js) - Google Analytics