胡言乱语之交换排序

废话不多说直接开始

第三种武功:交换排序

  交换排序分为两类,冒泡排序(BubbleSort)和快速排序(QuickSort)。

一、算法实现思想;

  BubbleSort算法实现思想:

      两两比较相邻记录的关键码,如果反序则交换。直到所有记录顺序为止。

  QuickSort算法实现思想:

     首先选择一个轴值(一般选平均值,我们这里选数组的第一个值)作为比较基准。将待排序的记录分割成两部分。左侧记录的关键码均小于轴值,右侧记录的关键码均大    于轴值。进过若干次调整直到整个序列有序为止。

二、关于算法的思考,以及执行步骤的区分;

      BubbleSort算法实现分解

             在一趟冒泡排序中若干个记录位于最终为止如何调整?

                在每一次的比较中,会逐步筛选下去。每次都是选择最大的记录后移。而且一次排序结束后又标志位标记。 

            如何确定每一次冒泡的范围,使得已经位于最终位置的记录不参与下一趟排序?

                设置标志位,使得每次排序过程中最后一次的交换位置存放到暂存变量exchange中。

            如何判定冒泡排序的结束?

               判定当前的暂存值是否为零。

      QuickSort算法实现

          如何有效的选择轴值?

            一般情况下,算法的性能根据实际情况不同而不同,一般选择整个序列的平均值。本程序选择数组的一个元素

         如何进行一次划分?

            以轴值交换位置作为标准,将记录关键码小于轴值得存放在左边,将记录关键码大于轴值得放在右边。

        如何判别排序结束?

            进行递归划分直到所有的记录有序。

三、对算法的具体代码实现(JAVA,C++);

冒泡排序的C++代码实现

*

*    交换排序之冒泡排序

*    前置条件:无顺序的一个数组

*    输      入:数组以及数组长度

*    处      理:对数组完成冒泡排序

*    输      出:有序数组

*    后置条件:无

*/

void BubbleSort(int r[],int n)

{

    int exchange=n;

    int temp;

    while(exchange)

    {

        int bound=exchange;

            exchange=0;

        for(int i=0;i<bound;i++)

        {

            if(r[i]>r[i+1])

            {       

                temp=r[i+1];

                r[i+1]=r[i];

                r[i]=temp;

                exchange=i;   

            }

        }

    }

}

快速排序的C++代码实现

/*

*    交换排序之一次划分

*    前置条件:无顺序的一个数组

*    输      入:数组以及数组起始位置和终止位置

*    处      理:进行一次划分

*    输      出:轴值的位置

*    后置条件:无

*/

int Partition(int r[],int first,int end)

{

    int i=first;

    int j=end;

    int temp;

    while(i<j)

    {

        while(i<j&&r[i]<r[j])//左边开始
            i++;

        if(i<j)
        {

            temp=r[i];
           r[i]=r[j];
            r[j]=temp;
            j--;
        }
        while(i<j&&r[i]<r[j])//右边开始
            j--;

        if(i<j)

        {
            temp=r[i];
            r[i]=r[j];
            r[j]=temp;
            i++;
        }
    }
return i;
}

/*

*    交换排序之快速排序

*    前置条件:无顺序的一个数组

*    输      入:数组以及数组起始位置终止位置

*    处      理:对数组完成快速排序

*    输      出:有序数组

*    后置条件:无

*/

void QuickSort(int r[],int first,int end)

{

    if(first<end)

    {

        int pivot=Partition( r,first, end);

        QuickSort( r, first,pivot-1);

        QuickSort( r,pivot+1, end);

    }

}

四、时间空间、效率、稳定性分析:


排序类型


快速排序(QuickSort)


冒泡排序(BubbleSort)


最好执行时间


O(nlog2n)


O(n)


最坏执行时间


O(n2)


O(n2)


平均执行时间


O(nlog2n)


O(n2)


额外辅存空间


1


-------


稳定性


不稳定


稳定

    

五、实际应用;

快速排序时已知性能最好的排序算法,UNIX系统中的qsort()函数基于快速排序实现。应用于记录个数多,随机排列的待排序序列中。

参考文献:算法导论

时间: 2024-10-24 18:34:42

胡言乱语之交换排序的相关文章

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[交换排序之快速排序]的例程. 1.以第1个元素作为基准 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定

交换排序之冒泡排序和快速排序

交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 排序入门之冒泡排序 冒泡排序是典型的交换排序算法.冒泡排序的时间复杂度为O(n2),可以说效率比较低,但是,冒泡排序体现的思想是学习排序算法很好的入门,尤其是对学习快速排序(在冒泡排序基础之上发展起来的)很有帮助. 基本思想 冒泡排序的基本思想是,进行(最多进行)n-1趟冒泡,其中n为数据的个数,其中每次冒泡会将未排序的最大

交换排序算法

交换排序的基本思想是:两两比较待排序记录的关键字,一旦发现两个记录不满足次序要求时则进行交换,直到整个序列全部满足要求为止. 交换排序算法分为冒泡排序和快速排序 冒泡排序(Bubble Sort)是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上"漂浮"(左移) 或者使关键字大的记录如石块一样逐渐向下"坠落"(右移). 代码 void bubbleSort(int[] list){ for(i

患者砍医生事件的一些胡言乱语

今天,医学专业的同学又刷满了我的屏幕.这次不是西南,不是东北,而是南部沿海的广州.我所在上学的城市广州.也不是魏则西式稀罕病的主治医生,而是一名普普通通的刚从前线退休下来口腔医生.更让人难以置信的事,网传凶手系20多年前该医生的患者,而这一切的患源都来源于20多年前的一次治疗,更重要的是,该患者疑似精神患者,并且在伤人过后已跳楼自杀,而今天中午又传来了噩耗.(具体是否属实,待考察) 其实我对于这件事是很麻木的,就如很多人所说,我本不是医生,只是患者,这种事根本不可能发生在我身上.而伤害到患者利益

数据结构之——交换排序

1.交换排序算法实现 这里的交换排序指的是冒泡排序和快速排序, 其中快速排序的过程可以简单的理解为:选取序列首元素为枢轴值(pivot),然后分别从序列尾部找到第一个小于pivot的元素(A),从序列首部找到第一个大于pivot的元素(B),然后交换此A,B两元素,直至首尾遍历的两指针重合,一趟排序结束. 以下是这两算法的具体实现: 1 #include<iostream> 2 using namespace std; 3 4 //声明打印辅助函数 5 void printArray(int

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

前两篇文章中介绍了选择排序和插入排序,今天我们继续往下来介绍其他的排序算法,介绍交换排序中的冒泡排序和快速排序. 1.交换排序:冒泡排序 定义:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推直至第n-1个记录和第n个记录的关键字比较过为止. 做法:上述过程称为第一趟冒泡排序.其结果是关键字最大的记录被交换到第n个记录的位置.然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是关键字次大的记录被交换

【技术宅2】插入选择冒泡快速交换排序算法

//插入排序(一维数组) //插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. function insert_sort($arr){ $count=count($arr); for($i=1;$i<$count;$i++){ $tem=$arr[$i];// 获得当前值 $j=$i-1;// 获得当前值的前一个位置 while($arr[$j]>$tem){// 如果当前值小于前一

交换排序算法---冒泡排序与快速排序

本文介绍两种交换排序方法:冒泡排序.快速排序 冒泡排序 冒泡排序基本思想 每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是O(N ^2). 冒泡排序实现过程 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度