`

【2015工作总结】排序算法

 
阅读更多

排序算法汇总:

  时间复杂度 空间复杂度
稳定排序    
气泡排序 最差、平均都是O(n²),最好是O(n) 1
鸡尾酒排序 最差、平均都是O(n²),最好是O(n) 1
插入排序 最差、平均都是O(n²),最好是O(n) 1
归并排序 最差、平均、最好都是O(nlog n) O(n)
桶排序 O(n) O(n)
基数排序 O(dn) O(n)
二叉树排序 O(nlog n) O(n)
图书馆排序 O(nlog n) O(n)
     
不稳定排序    
选择排序 最差、平均都是O(n²) 1
希尔排序 O(nlog n) 1
堆排序 最差、平均、最好都是O(nlog n) 1
快速排序 平均是O(nlog n),最坏是O(n²)

O(nlog n)

 

 

排序算法解释:

1

大部分程序的大部分指令之执行一次,或者最多几次。

如果一个程序的所有指令都具有这样的性质,我们说这个程序的执行时间是常数。

logN 

如果一个程序的运行时间是对数级的,则随着N的增大程序会渐渐慢下来,

如果一个程序将一个大的问题分解成一系列更小的问题,

每一步都将问题的规模缩减成几分之一,一般就会出现这样的运行时间函数。

在我们所关心的范围内,可以认为运行时间小于一个大的常数。

对数的基数会影响这个常数,但改变不会太大:

当N=1000时,如果基数是10,logN等于3;如果基数是2,logN约等于10.

当N=1 00 000,logN只是前值的两倍。

当N时原来的两倍,logN只增长了一个常数因子:

仅当从N增长到N平方时,logN才会增长到原来的两倍。

N

如果程序的运行时间的线性的,很可能是这样的情况:

对每个输入的元素都做了少量的处理。

当N=1 000 000时,运行时间大概也就是这个数值;

当N增长到原来的两倍时,运行时间大概也增长到原来的两倍。

如果一个算法必须处理N个输入(或者产生N个输出),那么这种情况是最优的。

NlogN

如果某个算法将问题分解成更小的子问题,独立地解决各个子问题,

最后将结果综合起来,运行时间一般就是NlogN。

我们找不到一个更好的形容,就暂且将这样的算法运行时间叫做NlogN。

当N=1 000 000时,NlogN大约是20 000 000。

当N增长到原来的两倍,运行时间超过原来的两倍,但超过不是太多。

 N平方

如果一个算法的运行时间是二次的(quadratic),

那么它一般只能用于一些规模较小的问题。

这样的运行时间通常存在于需要处理每一对输入数据项的算法

(在程序中很可能表现为一个嵌套循环)中,

当N=1000时,运行时间是1 000 000;

如果N增长到原来的两倍,则运行时间将增长到原来的四倍。

N三次方

 类似的,如果一个算法需要处理输入数据想的三元组

(很可能表现为三重嵌套循环),

其运行时间一般就是三次的,只能用于一些规模较小的问题。

当N=100时,运行时间就是1 000 000;

如果N增长到原来的两倍,运行时间将会增长到原来的八倍。

2的N次方

如果一个算法的运行时间是指数级的(exponential),

一般它很难在实践中使用,即使这样的算法通常是对问题的直接求解。

当N=20时,运行时间是1 000 000;

如果增长到原来的两倍时,运行时间将是原时间的平方!

 

排序算法-冒泡排序:

  // 冒泡排序
	public static void bubbleSort(int[] source) {
		if (null != source && source.length > 0)
		for (int i = source.length - 1; i > 0; i--)
			for (int j = 0; j < i; j++)
				if (source[j] > source[j + 1])
					swap(source, j, j + 1);
	}
	// 数组两个位置的值互换
	public static void swap(int[] source, int x, int y) {
		int temp = source[x];
		source[x] = source[y];
		source[y] = temp;
	}
	// 数组打印控制台
	public static void print(int[] source) {
		for (int i : source) 
			System.out.print(i+" ");
	}

	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		bubbleSort(a);
		print(a);
	}

 

排序算法-选择排序:

	//选择排序
	public static void selectSort(int[] source) {
		if (null != source && source.length > 0)
			for (int i = 0; i < source.length; i++)
				for (int j = i + 1; j < source.length; j++)
					if (source[i] > source[j])
						swap(source, i, j);
	}
	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		selectSort(a);
		print(a);
	}

 

排序算法-插入排序:

	// 插入排序
	public static void insertSort(int[] source) {
		if (null != source && source.length > 0)
			for (int i = 1; i < source.length; i++)
				for (int j = i; (j > 0) && (source[j] < source[j - 1]); j--)
					swap(source, j , j - 1);
	}
	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		insertSort(a);
		print(a);
	}

 

排序算法-Shell排序

	// Shell排序
	public static void shellSort(int[] source, int index) {
		int i, j, k;			// 循环计数变量
		int temp;			// 暂存变量
		boolean change;	// 数据是否变化
		int dataLength;	// 分隔集合的间隔长度
		int pointer;		// 进行处理的位置
		
		dataLength = index / 2;	// 初始集合间隔长度
		while (dataLength != 0) {	// 数列仍可进行分隔
			// 对每个集合进行处理
			for (j = dataLength; j < index; j++) {
				change = false;
				temp = source[j];					// 暂存data[j]的值,待交换值时用
				pointer = j - dataLength;	// 计算进行处理的位置
				// 进行集合内数值的比较
				while (temp < source[pointer] && pointer >= 0 && pointer <= index) {
					source[pointer + dataLength] = source[pointer];
					// 计算下一个欲进行处理的位置
					pointer = pointer - dataLength;
					change = true;
					if (pointer < 0 || pointer > index)
						break;
				}
				// 于最后的数值交换
				source[pointer + dataLength] = temp;
				
				if (change) {
					// 打印目前排序结果
					System.out.print("排序中:");
					for (k = 0; k < index; k++)
						System.out.printf(" %3s ", source[k]);
					System.out.println("");	
				}
			}
			dataLength = dataLength / 2;	//计算下次分割的间隔长度
		}
	}
	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		shellSort(a, a.length);
		print(a);
	}

 

排序算法-二分排序:

 

	// 二分排序 查找
	public static int binarySearch(int[] a, int value) {
		int size = a.length;
		int low = 0, high = size - 1;
		int mid;
		while (low <= high) {
			mid = (low + high) / 2;
			if (a[mid] < value) {
				low = low + 1;
			} else if (a[mid] > value) {
				high = high - 1;
			} else {
				return mid;
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		shellSort(a, a.length);
		System.out.println(binarySearch(a,4));
	}

 

排序算法-快速排序

	// 快速排序
	public static void quickSort(int[] source, int low, int high) {
		int i, j, x;
		if (low < high) {
			i = low;
			j = high;
			x = source[i];
			while (i < j) {
				while (i < j && source[j] > x) {
					j--;
				}
				if (i < j) {
					source[i] = source[j];
					i++;
				}
				while (i < j && source[i] < x) {
					i++;
				}
				if (i < j) {
					source[j] = source[i];
					j--;
				}
			}
			source[i] = x;
			quickSort(source, low, i - 1);
			quickSort(source, i + 1, high);
		}
	}

	public static void main(String[] args) {
		int[] a = {4,2,1,6,3,6,0,-5,1,1};
		quickSort(a, 0, a.length - 1);
		print(a);
	}

 

分享到:
评论

相关推荐

    C#排序算法总结

    C#排序算法总结涵盖了交换排序和插入排序两大类排序算法,其中交换排序包括了冒泡排序、选择排序和快速排序,而插入排序则涉及直接插入排序和折半插入排序。下面将详细介绍每种排序算法的实现原理、特点以及在C#中的...

    排序算法总结.doc

    排序算法是计算机科学中的基础概念,用于组织和整理数据,使其按照特定顺序排列。以下是对几种常见排序算法的详细说明: 1. 插入排序: 插入排序是一种简单的排序算法,其时间复杂度为O(n^2)。它通过将每个元素...

    几种排序算法总结及比较

    在计算机科学领域,排序算法是数据结构与算法分析的重要组成部分,它主要用于将一组数据按照特定顺序进行排列。这里我们将深入探讨几种常见的排序算法,并在VS2013环境下进行实现和比较。 1. 冒泡排序(Bubble Sort...

    各种排序算法比较

    ### 各种排序算法比较 #### 一、稳定性比较 稳定性是排序算法中一个重要的特性,指的是相等的元素在排序前后保持原有的相对位置不变。根据文档提供的信息,我们可以总结出以下结论: - **稳定排序**:插入排序、...

    常用排序算法总结

    ### 常用排序算法总结 #### 一、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,依次比较相邻的两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复进行的,直到没有再需要...

    排序算法总结文档

    排序算法是计算机科学中最基础且重要的算法之一,用于将一组数据按照特定顺序排列。这里我们主要探讨五种经典的排序算法:选择排序、冒泡排序、插入排序、快速排序以及归并排序。 1. **选择排序**: 选择排序的...

    各种排序算法总结(ppt)

    在这个名为“各种排序算法总结(ppt)”的资料中,我们将会深入探讨多种常见的排序算法,包括它们的基本原理、优缺点以及实际应用。** 首先,我们要了解排序的目的是为了使数据有序,这在数据处理和分析中具有广泛...

    最经典的8大排序算法总结

    在本篇总结中,将探讨8种经典的排序算法,分别是冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、二叉树排序和基数排序。 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的排序算法。它重复地遍历要...

    算法与数据结构的排序算法

    总结,排序算法是计算机科学中的基础工具,理解和掌握各种排序算法的原理、优缺点以及应用场景,对于提升编程技能和解决实际问题具有重要意义。通过对"排序.c"文件的分析,我们可以更直观地理解这些理论知识,并将其...

    排序算法总结.docx

    本文将对数据结构常见的八大排序算法进行详细阐述,包括它们的基本思想、工作原理以及适用场景。 1. 直接插入排序: 直接插入排序是一种简单直观的排序算法,它的工作原理类似于我们平时手动排序扑克牌。首先,假设...

    八大经典排序算法总结和源代码

    八大经典排序算法总结和源代码 在计算机科学中,排序算法是最基本也是最重要的算法之一。排序算法的性能直接影响到整个系统的性能。今天,我们将总结八大经典排序算法,并提供C++实现的源代码。 一、稳定排序和...

    总结了各种排序算法,并用C++代码实现,并有演示

    本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型的排序算法以及它们的C++实现,还有可能的可视化演示,帮助理解每种算法的工作原理。 首先,让我们逐一了解常见的排序...

    2009软考程序员:排序算法的各趟排序算法

    在计算机科学领域,排序算法是数据结构与算法中不可或缺的一部分,尤其对于程序员来说,理解和掌握各种排序算法至关重要。2009年的软考程序员考试中,排序算法是重点考察的知识点之一,它涉及到多趟排序的过程,即...

    3种排序算法可视化程序 c++ 算法

    总结,这个C++项目提供了一种直观的学习和教学方式,通过可视化来探索和理解三种基本排序算法。对于初学者来说,这是一个很好的起点,可以深入理解排序算法的运作机制。同时,对于经验丰富的程序员,这也可以作为一...

    排序查找算法总结

    本文将对10种经典的排序算法进行总结,并对每种算法的时间复杂度、空间复杂度和适用场景进行分析。 一、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它的工作原理是:从数组的第一个元素开始,比较...

    C++数据结构排序算法

    C++数据结构排序算法总结 在计算机科学中,排序算法是最基本和最重要的算法之一。在实际应用中,排序算法广泛应用于各种领域,如数据分析、机器学习、数据库管理等。C++数据结构排序算法总结将为您提供详细的排序...

    快速排序算法以及归并算法

    快速排序和归并排序都是高效的排序算法,但它们的工作原理有所不同。快速排序通过一次划分将数组分成两部分,归并排序则是先递归分割再合并。在实际应用中,快速排序通常具有较高的平均性能,但归并排序由于其稳定性...

Global site tag (gtag.js) - Google Analytics