排序算法(三)——交换排序

前两篇文章中介绍了选择排序和插入排序,今天我们继续往下来介绍其他的排序算法,介绍交换排序中的冒泡排序和快速排序。

1、交换排序:冒泡排序

定义:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推直至第n-1个记录和第n个记录的关键字比较过为止。

做法:上述过程称为第一趟冒泡排序。其结果是关键字最大的记录被交换到第n个记录的位置。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是关键字次大的记录被交换到第n-1个记录的位置上。最多进行n-1趟这样的排序,若在某趟冒泡排序过程没有进行相邻位置的元素交换处理,则可结束排序过程。

举例:下面我们来举个例子说明,假设待排序列为8,2,6,7,3,9,4 按照从大到小的顺序排序。

上述操作是第一趟冒泡排序,然后按照上述方法进行第二次冒泡排序,然后进行第三次、第四次.....直至若在某趟冒泡排序过程没有进行相邻位置的元素交换处理,则可结束排序过程。好了,下面说快速排序。

2、交换排序:快速排序

定义:快速排序是对冒泡排序的一种改进,其基本思想是通过一趟排序将待排的记录划分为独立的两个部分,其中一部分记录的关键字均不大于另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序。

做法:附设两个指针i和j,它们的初值分别指向第一个记录和第二个记录,设枢轴记录(通常是第一个记录)的关键字为pivotkey,则首先从j所指位置起向前搜索,找到第一个关键字小于pivotkey的记录与枢轴记录相互交换,然后从i所指位置向后搜索,找到第一个关键字大于pivotkey的记录与枢轴记录相互交换。重复这两步直至i等于j时为止。

举例:按照我们定义中的这种说法,我们假设待排数列,5,1,6,3,7,9 要设定两个指针i和j,让i和j分别指向这组数据中的第一个记录和第二个记录,设枢轴记录key(设第一个记录为key的值)的值为5,为了直观的显示我们画图来表示,如下:

已经找出i、j和key的对应值之后,然后开始进行排序。首先从j开始向前搜索,找到第一个比key值小的数,在我们这个序列中是下标为3的数值3,所以将key值也就是第一个值5与数值3交换位置,此时j的值由原来的下标5变为下标3。

所以此时序列变为

然后从i开始向后搜索,招待第一个比key值大的数,找到下标为2的数值6,此时将数值6与key值交换位置,此时i的位置由原来的下标0变为现在的下标2.

此时序列变为:

重复上面的步骤,使得j=j-1我们发现i和j数值相同了,它们都指向了下标2,于是结束循环得到结果。值得注意的是快速排序并不能直接得到最终结果,它只是让比key值小和比key值大的数分到key的两边,为了得到最终结果还需要将分到两边比key值大和比key值小的的数再分别重复执行上述的快速排序操作,得到最终结果。

******************************************************************************************************

下一篇文章我们将介绍归并排序和基数排序,敬请期待!

排序算法(三)——交换排序,布布扣,bubuko.com

时间: 2024-08-09 10:34:45

排序算法(三)——交换排序的相关文章

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

(高效率排序算法三)堆排序

一.堆的介绍         动态效果图         堆有如下特点的二叉树: 1.他是完全的二叉树.也就是说,除了树的最后一层布需要时满的,其他的每一层从左到右都是满的.(如下图的完全二叉树跟不完全二叉树) 2.它常常用一个数组在实现.(如下图显示了堆它与数组之间的关系.堆在存储器中的表示是数组:堆只是概念上的表示.注意树是完全二叉树,并且所有的节点满足堆的条件) 3.堆中的每一个节点都满足堆的条件,也就是说每一个节点的值都大于或者等于这个节点的子节点的值(如上图) 二,堆的移除 1.只能移

常用算法之排序算法三【快速排序】

快速排序是东尼·霍尔在1962提出的划分交换排序,并采用一种分治的策略.在这,我们先总结一下:快速排序 = 划分交换排序 + 分治.然后我们在一一介绍他. 划分交换排序 在讨论它时,感觉有种看了崔颢<黄鹤楼>之后,再去写黄鹤楼的感觉,因为MoreWindows写 得白话经典算法系列之六 快速排序 快速搞定已经足够出色了.我在这只是进行简单的复述,你需要了解更多请看他的博文. 先来看看划分交换排序的具体算法描述: 1.从数列中选出一个数作为基准 2.从数组中选出比它大的数放右边,比它小的数放左边

排序算法之交换排序

首先,上脑图. 1.为什么要学习排序算法? 这是算法学习的基础,经典的排序算法有着很广泛的用途,一遍遍的被人所使用.而且,在面试找工作的时候,数据结构中的排序算法,也是一个很重要的基本功,经常会被用人单位拿来出题目. 2.如何学习排序算法? 第一步是理解排序算法的原理,这也是最重要的一步. 第二步就是看经典的算法实现,抠细节一个个理解原理到实现经过了哪些变化. 第三部是用纸把算法实现抄一遍,这个时候会发掘出认识和实际的偏差. 第四步是把算法默写出来,这也是很重要的一步,类似于牛吃了食物之后的反刍

排序算法(三)之堆排序

预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶

常用排序算法(三)直接插入排序

直接插入排序 概要 本章介绍排序算法中的直接插入排序.内容包括:1. 直接插入排序介绍2. 直接插入排序图文说明3. 直接插入排序的时间复杂度和稳定性4. 直接插入排序实现4.1  直接插入排序C实现4.2  直接插入排序C++实现4.3  直接插入排序Java实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3596881.html 更多内容:数据结构与算法系列 目录 直接插入排序介绍 直接插入排序(Straight Insertion Sort

排序算法三:堆排序(Heapsort)

堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步. (一)算法实现 1 protected void sort(int[] toSort) { 2 buildHeap(toSort); 3 for (int i = toSort.length - 1; i > 0; i--) { 4 CommonUtils.swap(toSort, 0, i); 5 adjustHeap(toSort, 0, i); 6 } 7 } 8 9 /**

八大排序算法之五--交换排序—冒泡排序(Bubble Sort)

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 算法实现:(HDU 1040 亲测 AC) #include<iostream> using namespace std; const int N =1005; void BubbleSort(int a[],int ); void print(int a[],int num); vo

排序算法三:快速排序

一.算法思想 1.快速排序基本思想是:分治思想:即将一个大的问题通过:分解--解决--合并,这几步,从而实现排序.一般是将大问题划分成很多个一样的问题,然后递归的解决每个小问题.最后,将每个小问题解决的结果合并起来就解决了问题. 2.基本过程:对于一个无序的序列,首先,选择一个关键元素,作为划分元素的分界线:一般选择第一个或者最后一个元素.然后,遍历数组,将小于关键元素的放到它的左边,大于关键元素的放到他的右边,最后将关键元素插入到正确位置.然后,按照相同的处理方法,划分左右两部分的内容.最后,

Java排序算法(三):直接插入排序

[基本思想] 关键:在前面已经排好序的序列中找到合适的插入位置 步骤: 1. 从第一个元素開始,该元素能够觉得已经排好序. 2. 取出下一个元素.在已经排好序的元素序列中从后往前扫描进行比較. 3. 假设该元素(已排序) 大于新元素,则将该元素移到下一位置. 4. 反复步骤3,直到找到已排序的元素小于或者等于新元素的位置. 5. 将新元素插入到该位置后面. 6. 反复步骤2~5 [Java实现] public class InsertSort { public static void main(