`
vv0885
  • 浏览: 2077 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

常用排序算法总结

阅读更多
基础类:
public abstract class Sorter<E extends Comparable<E>> {
    public abstract void sort(E[] array, int from, int len);

    public final void sort(E[] array) {
        sort(array, 0, array.length);
    }

    protected final void swap(E[] array, int from, int to) {
        E tmp = array[from];
        array[from] = array[to];
        array[to] = tmp;
    }
}

------------------------------------------------------------------------------------------------------------------------------------------

一、插入排序[稳定]

· 这里说的是直接插入排序,该算法在数据规模小的时候十分高效;
· 基本思想:将n个元素的数列分为已有序和无序两个部分。每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中;
· 算法步骤:
    1、从有序数列{a1}和无序数列{a2,a3,…,an}开始进行排序;
    2、处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1、ai-2,…,a1进行比较,找出合适的位置将ai插入;
    3、重复2,共进行n-1的插入处理,数列全部有序。

· 代码:
public class InsertSorter<E extends Comparable<E>> extends Sorter<E> {
    public void sort(E[] array, int from, int len) {
        int j;
        E tmp;
        for (int i = from + 1; i < from + len; i++) {
            tmp = array[i];
            j = i;
            for (; j > from; j--) {
                if (tmp.compareTo(array[j - 1]) < 0) {
                    array[j] = array[j - 1];
                } else break;
            }
            array[j] = tmp;
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------------------

二、冒泡排序[稳定]

· 基本思想:通过两两比较待排序元素,若为逆序(递增或递减)则进行交换,将待排序元素从左至右比较一遍称为一趟“冒泡”。每趟冒泡都将待排序列中的最大关键字交换到最后(或最前)位置。直到全部元素有序为止;
· 算法步骤[正序排列]:
    1、将关键字按纵向排列,然后自下而上地对每两个相邻的关键字进行比较,若为逆序(即kj-1>kj),则将两个记录交换位置,这样的操作反复进行,直至全部记录都比较、交换完为止。一趟冒泡处理,就将关键字最小的记录安排在第一记录的位置上;
    2、对后n-1个记录重复同样操作,再将次小关键字记录安排在第二个记录的位置上;
    3、重复上述过程直至没有记录需要交换为止。

· 代码:
public class BubbleSorter<E extends Comparable<E>> extends Sorter<E> {
    public void sort(E[] array, int from, int len) {
        for (int i = from; i < from + len; i++) {
            for (int j = from + len - 1; j > i; j--) {
                if (array[j].compareTo(array[j - 1]) < 0) {
                    swap(array, j - 1, j);
                }
            }
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------------------

三、归并排序[稳定]

· 基本思想:将两个(或两个以上)有序表合并成一个新的有序表:即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列;将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并;
· 算法步骤[正序排列]:
    1、把待排序的n个记录看作是长度为1的有序序列。将相邻子序列两两归并为长度为2的有序序列;
    2、把得到的n/2个长度为2的有序子序列再归并为长度为 2*2 的有序序列;
    3、按2的方式,重复对相邻有序子序列进行归并操作,直到成为一个有序序列为止。

· 代码:
public class MergeSorter<E extends Comparable<E>> extends Sorter<E> {

    public void sort(E[] array, int from, int len) {
        if (len <= 1) return;
        E[] temporary = (E[]) Array.newInstance(array[0].getClass(), len);
        merge_sort(array, from, from + len - 1, temporary);

    }

    private void merge_sort(E[] array, int from, int to, E[] temporary) {
        if (to <= from) {
            return;
        }
        int middle = (from + to) / 2;
        merge_sort(array, from, middle, temporary);
        merge_sort(array, middle + 1, to, temporary);
        merge(array, from, to, middle, temporary);
    }

    private void merge(E[] array, int from, int to, int middle, E[] temporary) {
        int k = 0, leftIndex = 0, rightIndex = to - from;
        System.arraycopy(array, from, temporary, 0, middle - from + 1);
        for (int i = 0; i < to - middle; i++) {
            temporary[to - from - i] = array[middle + i + 1];
        }
        while (k < to - from + 1) {
            if (temporary[leftIndex].compareTo(temporary[rightIndex]) < 0) {
                array[k + from] = temporary[leftIndex++];
            } else {
                array[k + from] = temporary[rightIndex--];
            }
            k++;
        }
    }
}
分享到:
评论

相关推荐

    常用排序算法总结 常用排序算法总结 常用排序算法总结

    常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结常用排序算法总结

    常用排序算法总结——数据结构

    常用排序算法总结 数据结构 ppt 课件知识 排序的复杂性 。

    常用排序算法总结(含Java代码)

    冒泡排序和快速排序是两种基础但广泛使用的数据排序算法。冒泡排序由于其简单直观的特性,易于理解和实现,而快速排序则以其较高的效率在数据量较大时展现出优势。 首先,让我们来看冒泡排序算法。冒泡排序通过重复...

    常用排序算法总结及C源程序

    排序算法在计算机科学中占有重要地位,它们是数据处理和信息管理的基础。本文将深入探讨四种常见的排序算法:直接插入排序、折半插入排序、冒泡排序和快速排序,并提供相应的C语言源代码实现。 1. 直接插入排序: ...

    各种排序算法总结

    常用排序算法总结,包括插入排序(InsertionSort),冒泡排序(BubbleSort),选择排序(SelectionSort),快速排序(QuickSort), * 二路归并排序(MergeSort),堆排序(HeapSort)。有每一种排序算法的复杂度分析以及实现...

    常用的排序算法总结(各种内部排序算法和外部排序算法)

    本文将对几种常见的内部排序算法和外部排序算法进行详细总结。 首先,排序的基本定义是:给定一个包含n个记录的序列,其关键字序列分别为K1, K2, ..., Kn,如果存在一个排列p1, p2, p3, ..., pn,使得关键字满足非...

    排序算法总结.doc

    快速排序是最常用的排序算法之一,由C.A.R. Hoare提出。它采用分治策略,选取一个“基准”元素,将数组分为两部分,使得一部分所有元素小于基准,另一部分所有元素大于基准,然后递归地对两部分进行快速排序。平均...

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

    ### 数据结构中几种常用的排序算法总结 #### 一、引言 在计算机科学与数学领域,排序算法是一种能够按照特定顺序(如数值顺序或字典顺序)排列一系列数据的算法。排序算法对于许多其他算法(如搜索算法和合并算法)...

    常用排序算法的比较

    ### 常用排序算法的比较 #### 一、设计内容和要求 1. **设计内容**:通过随机函数产生N个随机整数,并采用多种排序算法对这些数进行排序,进而分析各种算法所需的排序时间,以确定哪些算法更为高效。 2. **设计...

    用C语言实现常用排序算法

    一、问题描述 本项目旨在实现并比较六...总结,这个项目提供了对C语言实现的排序算法的深入理解和实践,通过对各种排序方法的性能测试,我们可以更好地理解它们在不同场景下的适用性,并为实际问题选择合适的排序算法。

    常用数据结构排序算法总结

    【排序算法】是计算机科学中一个重要的领域,它涉及到如何有效地组织和整理数据,以便于快速查找、访问和处理。本文将对几种常见的排序算法进行详细的解析,包括冒泡排序、交换排序、选择排序和插入排序,这些都是在...

    排序算法总结和比较

    本文主要总结和比较了九种常见的排序算法:快速排序、归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序以及基数排序。 1. **快速排序**:快速排序是一种基于分治思想的高效排序算法,由C.A.R....

    C#常用排序算法

    总结来说,了解和掌握这些基本排序算法有助于开发者根据具体需求选择合适的排序方法,无论是为了优化性能还是为了理解算法的内在逻辑。在实际编程中,可以根据数据规模、是否已经部分排序等因素来选择使用冒泡排序、...

    几种内部排序算法总结

    ### 几种内部排序算法总结 #### 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,...

    排序查找算法总结

    排序查找算法总结 排序算法是计算机科学中的一种基本算法,用于对数据进行排序。在各种排序算法中,每种算法都有其特点和应用场景。本文将对10种经典的排序算法进行总结,并对每种算法的时间复杂度、空间复杂度和...

Global site tag (gtag.js) - Google Analytics