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

排序算法汇总分析

阅读更多
插入排序
插入排序是一种通过不断地把新元素插入到已排好序的数据中的排序算法,常用的插入排序算法包括直接插入排序和shell排序,直接插入排序实现比较简单,时间复杂度是O(n),但是直接插入没有充分的利用已插入的数据已经排序这个事实,因此有很多针对直接插入排序改进的算法,例如折半插入排序等,下边是直接插入排序的Java实现:

public static void insertSort(int[] elements){
        for(int i = 1;i <elements.length; i++){
            int j = -1;
            while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
            if(j < i){
                //将j之后的数据移动一位,然后把elements[i]移动到j处
                int temp = elements[i];
                for(int k = i-1;k >= j;k--){
                    elements[k+1] = elements[k];
                }
                elements[j] = temp;
            }
        }
}

  另一种常用的插入排序算法:Shell排序也是对直接插入排序算法的一种优化,因此可以说直接插入排序是一种特殊的Shell排序,Shell排序对直接插入排序的优化主要体现在,Shell排序通过使用一个增量序列(递减),每次把要排序的数组分成几个子数组,然后对子数组进行插入排序,这样可以减少比较和移动数据的次数,Shell排序是一种非常高效的排序算法,该算法的思想是:
  1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
  2.令h=h/2,重复第1步
  3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)
  Shell排序的Java实现如下:

public static void shellSort(int[] elements){
        for(int h = elements.length/2;h > 0;h /= 2){
             
            for(int i = h;i < elements.length; i++){
                int j = i % h;
                while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
                if(j < i){
                    //将j之后的数据移动h位,然后把elements[i]移动到j处
                    int temp = elements[i];
                    for(int k = i-h;k >= j;k -= h){
                        elements[k+h] = elements[k];
                    }
                    elements[j] = temp;
                }
            }
             
        }
}


快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n)。

package src;

public class QSort 
{

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{
		// TODO 自动生成方法存根
		quicksort qs = new quicksort();
		int data[] = {44,22,2,32,54,22,88,77,99,11};
		qs.data = data;
		qs.sort(0, qs.data.length-1);
		qs.display();
	}

}


class quicksort
{
	public int data[];
	
	private int partition(int sortArray[],int low,int hight)
	{
		int key = sortArray[low];
		
		while(low<hight)
		{
			while(low<hight && sortArray[hight]>=key)
				hight--;
			sortArray[low] = sortArray[hight];
			
			while(low<hight && sortArray[low]<=key)
				low++;
			sortArray[hight] = sortArray[low];
		}
		sortArray[low] = key;
		return low;
	}
	
	public void sort(int low,int hight)
	{
		if(low<hight)
		{
			int result = partition(data,low,hight);
			sort(low,result-1);
			sort(result+1,hight);
		}
		
	}
	
	public void display()
	{
		for(int i=0;i<data.length;i++)
		{
			System.out.print(data[i]);
			System.out.print(" ");
		}
	}
}


选择排序


public class ChooseSort {

	private final long[] origArr = new long[] { 12, 65, 2, 33, 89, 23, 10 };
	private final static int SORT_DEST = 0;
	private final static int SORT_ASC = 1;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ChooseSort chooseSort = new ChooseSort();
		chooseSort.sort(chooseSort.origArr, ChooseSort.SORT_ASC);

		for (int j = 0; j < chooseSort.origArr.length; j++) {
			System.out.println(chooseSort.origArr[j]);
		}
	}

	public void sort(long[] arrays, int sortType) {
		int len = this.origArr.length;

		for (int i = 0; i < len; i++) {
			// 从左往右比较
			int destIndex = i;
			for (int j = i; j < len - 1; j++) {
				if (sortType == ChooseSort.SORT_DEST) {
					if (this.origArr[destIndex] < this.origArr[j + 1]) {
						// this.swap(i, j + 1);
						destIndex = j + 1;
					}
				} else {
					if (this.origArr[destIndex] > this.origArr[j + 1]) {
						// this.swap(i, j + 1);
						destIndex = j + 1;
					}
				}
			}
			this.swap(i, destIndex);
		}
	}

	public void swap(int leftInde, int rightIndex) {
		long temp = this.origArr[leftInde];
		this.origArr[leftInde] = this.origArr[rightIndex];
		this.origArr[rightIndex] = temp;
	}

}



分享到:
评论

相关推荐

    python常用排序算法汇总

    该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...

    排序算法汇总.pdf

    ### 排序算法汇总 #### 一、基本概念与分类 **1. 什么是排序** 排序是一种基础且重要的数据处理技术,它涉及到对一组数据按照特定的规则进行组织,通常是根据记录中的某个或某些关键字段来进行升序或降序排列。...

    排序算法汇总 .doc排序算法汇总P: 冒泡排序 快速排序 选择排序 插入排序 希尔排序 堆排序

    排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........

    实现所有经典排序算法汇总

    在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地重新排列一组数据,使其按照特定标准(如升序或降序)排列。以下是对标题和描述中提到的经典排序算法的详细解释: 1. **选择排序...

    常见排序算法汇总

    交换排序是基于比较对象之间大小关系,通过交换元素位置来达到排序目的的一种排序算法。其中,冒泡排序是最基础的交换排序,它通过相邻元素间的比较和交换,逐步将较大的元素推向序列末尾。优化后的双向冒泡排序能...

    排序算法_排序算法汇总_排序算法_gettingzop_

    在计算机科学领域,排序算法是数据处理中至关重要的一部分,它涉及到如何有效地对一系列元素进行排列。本知识库主要涵盖了多种经典的排序算法,旨在为学习者提供一个全面的概述和理解。下面将逐一介绍这些排序算法...

    排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)

    排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...

    面试必备:排序算法汇总

    在面试中,了解这些排序算法的基本原理、时间复杂度和适用范围,以及能够灵活应用和分析它们,将大大增加你成功的机会。同时,熟悉C++和C语言的实现,能够加深你对算法的理解,并提高编程能力。在实际开发中,选择...

    数据结构排序算法汇总包-直接插入排序 折半插入排序 2—路插入排序 表插入排序 希尔排序 起泡排序 快速排序 简单选择排序 树形选择排序 堆排序 归并排序链式基数排序

    实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...

    java常用的7大排序算法汇总

    ### Java常用的七大排序算法 #### 1. 插入排序算法 插入排序是一种简单直观的排序算法。它的基本思想是:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 - **算法步骤**: 1. 将第一待排序...

    排序算法汇总--各类排序算法

    排序算法:排序算法汇总--各类排序算法 冒泡,选择,插入,快排,归并,堆排

    7种排序算法程序汇总

    7种排序算法程序汇总 冒泡排序 选择排序 插入排序 希排序尔 快速排序 二叉排序树 堆排序

    Java排序算法汇总

    本文将深入探讨标题"Java排序算法汇总"所涵盖的八大排序算法:起泡排序、堆排序、插入排序、归并排序、快速排序、选择排序、Shell排序以及优化后的归并排序和快速排序。 1. 起泡排序(Bubble Sort): 起泡排序是一...

    java排序算法汇总

    在编程领域,排序算法是数据处理的核心部分,尤其是在Java这样的高级语言中。本文将深入探讨在给定的压缩包文件中涉及的几种经典排序算法,包括归并排序、快速排序、简单选择排序、插入排序、冒泡排序、希尔排序以及...

    Java排序算法汇总大全.doc

    Java排序算法汇总大全 在计算机科学中,排序算法是用于对数据序列进行排列的算法,以便根据特定标准对其进行组织。本文将详细介绍Java中常见的几种排序算法,并提供它们的基本原理、性能分析以及适用场景。 1. ...

    基于Qt5-实现九大排序算法的代码汇总

    在本文中,我们将深入探讨如何使用Qt5框架和C++编程语言实现九大经典的排序算法。Qt5是一个跨平台的应用程序开发框架,它提供了丰富的库和工具,使得开发人员能够便捷地构建用户界面和应用程序逻辑。C++则是一种强大...

    算法导论排序算法汇总

    在计算机科学领域,排序算法是数据结构与算法分析中的核心部分。它们用于将一组数据按照特定顺序排列,以便于检索、分析或者优化后续的操作。《算法导论》是一本广泛认可的经典教材,深入浅出地介绍了各种算法,包括...

Global site tag (gtag.js) - Google Analytics