排序算法思想

直接插入排序:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

希尔排序:先将需要排序的数组按照某个增量d(n/2,n是待排序数据的个数),将数组分成若干组,每一组采用直接插入排序,然后再采用较小的增量(d/2)对数组进行分组,在每组中再进行直接插入排序,直到增量为1时,数组进行一次完全的直接插入排序后,排序完成。

简单选择排序:在要排序的数组中选择最小的数和第一个位置进行交换,然后在剩余的数据中选择最小的一个和第二个位置的数进行交换,知道倒数第二个和最后一个数据比较、交换。

堆排序:堆排序是一种树形选择排序,是对直接选择排序的有效改进。堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)时称之为堆。

    在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。

    完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。

    初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个堆,这时堆的根节点的数最大。

     然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列

    从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。

    所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

     即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

快速排序:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,

     此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。

     然后再把有序子序列合并为整体有序序列。

基数排序:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。

     这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

时间: 2024-10-14 03:39:08

排序算法思想的相关文章

几种排序算法思想

一.冒泡排序 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变.再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变.再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值.这样处理一轮后,a[n]的值一定是这组数据中最大的.再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的.再对a[1]~a[n-2]以相同方

各种排序算法思想复杂度及其java程序实现

一.冒泡排序(BubbleSort)1. 基本思想: 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们, 其结果是将最小的元素交换到待排序序列的第一个位置,我们称它为一趟冒泡.下一趟冒泡时,前一趟确定的最小元素 不再参与比较,待排序序列减少一个元素,每趟冒泡的结果把序列中最小的元素放到了序列的"最前面". 2.算法实现 package 冒泡排序; /** * 相邻数据两两比较,大的排上面,小的排下面 第一次

排序算法---思想简要概述

比较排序: 涉及知识: 分治法:将一个问题分解成规模更小.结构相似的子问题,解决问题A,变成了解决问题A1和A2,解决问题A1变成了解决问题A11和A12...,一直到最小单元,当最小单元问题解决后,依次向上返回,问题A得以解决.因为问题和子问题之间解决思路是相似的,所以解决时会调用相同的程序体,表现为问题调用自己解决子问题,而结果则是从最小单元依次向上返回,称之为递归. 1. 插入排序:在已排序好的序列中,给要插入元素找到并空出应在位置,并插入该元素. 2. 合并排序:将排序分解为合并两个内部

1. 选择排序算法思想及实现

思想 每次选择未排序元素中的最小值,将其放在最左边. 想象你打牌的时候,如果你手上有一堆牌,你每次找到最小的牌,然后将其出出来.手上的是未排序的牌,出出去的牌按顺序摆出来,就是已排序的. 比较耗时:第一次比较n,第二次比较n-1,以此类推 插入耗时:插入策略分为,移动选定元素前的元素,然后插入最小值:或者不断交换相邻元素,直到最小值到达所在位置:或者找到最小元素后,直接与需要排序的位置进行交换 前一个方案,只要复制一条语句即可,然后进行一次交换.第二种交换,每一次交换,需要三条语句.第三种,只需

数据结构杂谈(一)浅谈基本排序算法

0.基本概念 记录:待排序的项目 关键词:决定排序结果 稳定性:相同关键词的记录保持原来的相对次序 1.1插入排序(Insertion Sort) 算法思想 一种简单直观的排序算法,工作原理是通过构建有序序列:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法描述 具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于

经典排序算法的PHP实现类

近期广受笔试摧残,对于各种排序也是晕头转向. 更坑爹的是貌似大多都是用C++.Java实现相关算法,让我搞PHP的情何以堪,更何况,PHP本身就有排序函数sort(),其实来说,是很简单的,这也可能是为什么不用PHP进行排序吧. 但考虑到PHP毕竟也是一门面向对象的语言吧,我们利用原生的语法,也是可以实现经典排序算法的,先不说性能如何,切不要妄自菲薄吧. 下面为具体的经典排序算法的PHP实现类. <?php /** * Author: helen * CreateTime: 2016/4/15

排序算法汇总

1.排序算法简介 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序.假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的:否则称为不稳定的.   比较类非线性时间排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序).   非比较类

三种简单排序算法(java实现)

一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操                   作,直到排序完成. 示例演示: 算法实现: 1 for(int i=0;i<array.length-1;i++){//最多排序n-1次 2 for(int j=0;j<array.length-i-1;j++){//需要交换的次数 3 if(array[j]>array[j+1]){ 4 i

面试中的排序算法总结(转)

转自http://www.codeceo.com/article/10-sort-algorithm-interview.html 前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码.对这两种排序的代码一定要信手拈来才行.还有插入排序.冒泡排序.堆排序.基数排序.