数据结构的故事之交换排序

  交换排序,顾名思义,肯定是通过两个数或者几个数之间的比较和交换来达到排序的目的。基于交换的排序主要有冒泡排序快速排序

1、冒泡排序

通过两两之间的比较和交换,每次冒出一个最大的记录(升序)或者最小的记录(降序)。

void bubbleSort(int arr[],int n){
    int outer,inner;
    for(outer=1;outer<=n;outer++){
        for(inner=1;inner<=n-outer;inner++){
            if(arr[inner+1]<arr[inner]){
                arr[0] = arr[inner];
                arr[inner] = arr[inner+1];
                arr[inner+1] = arr[0];
            }
        }
    }
}

上述为常规的冒泡排序,但是如果最后面若干记录未发生交换,也就是后面的几个记录已经有序了,对于常规的冒泡排序,无论怎样都会进行冒泡,自然就增加了排序的时间。所以可对上述常规冒泡排序进行改进。如下:我们用一个exchangeIndex来记录每次交换的最后位置。

void bubbleSortModified(int arr[],int n){
    int outer,inner;
    int exchangeIndex = n;
    int exchange;
    while(exchangeIndex>1){
        exchange = 1;
        for(inner=1;inner<=exchangeIndex;inner++){
            if(arr[inner+1]<arr[inner]){
                arr[0] = arr[inner];
                arr[inner] = arr[inner+1];
                arr[inner+1] = arr[0];
                exchange = inner;
            }
        }
        exchangeIndex = exchange;
    }
}

2、快速排序

  快速排序:以序列中的某个记录为基准,把整个序列分成左右两组,左边序列小于基准,右边序列大于基准。然后对左右序列又选一个基准划分,依次下去直到左右序列的记录数为0。

int _quickSort(int arr[],int begin,int end){
    arr[0] = arr[begin];
    while(begin < end){
        while(begin<end && arr[end]>arr[0])
          end --;
        if(begin<end)
          arr[begin] = arr[end],arr[end] = arr[0],begin ++;
        else
          return begin;
        while(begin<end && arr[begin]<arr[0])
          begin ++;
        if(begin<end)
          arr[end] = arr[begin],arr[begin] = arr[0],end --;
        else
          return end;
    }
}

void quickSort(int arr[],int begin,int end){
    int middle;
    if(begin < end){
        middle = _quickSort(arr,begin,end);
        quickSort(arr,begin,middle-1);
        quickSort(arr,middle+1,end);
    }
}

3、总结

冒泡排序:时间复杂度o(n2),是稳定的排序算法。

快速排序:时间复杂度o(nlog2n),是不稳定的排序算法,所有排序算法中平均性能最好。

但是如果待排序序列本来就有序或者基本有序了,快速排序的性能会变得很差,它就退化成了冒泡排序,时间复杂度为o(n2)。所以快速排序适合那些随机序列的排序。

时间: 2025-01-31 08:57:06

数据结构的故事之交换排序的相关文章

数据结构的故事之插入排序

好久没写点什么了,最近很多企业都在招实习生,周围很多人也都开始到处投简历找实习了,搞的我们人心惶惶的,压力好大.尤其最近互联网好像很火的样子,作为传统通信行业的烟酒僧们,也都放弃了自己的老本行,开始投向了软开的队伍. 只可惜我们学的是<信号与系统>.<通信原理>这种底层的理论的通信课程,虽然看起来高大上,其实也就莫过于调制解调编码解码了.虽然也是从大一就开始学C语言,但是跟计算机比起来,无论各方面都相差甚远.说多了都是泪啊!!还是拿起数据结构踏踏实实地打好基础吧! 排序是数据结构里

交换排序:快速排序

快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略. 快速排序的主要思想: 从待排序列中选取一元素作为轴值(也叫主元). 将序列中的剩余元素以该轴值为基准,分为左右两部分.左部分元素不大于轴值,右部分元素不小于轴值.轴值最终位于两部分的分割处. 对左右两部分重复进行这样的分割,直至无可分割. 从快速排序的算法思想可以看出,这是一递归的过程. 两个问题: 要想彻底弄懂快速排序,得解决两个问题: 如何选择轴值?(轴值不同,对排序有影响吗?) 如何分割? 问题一:轴值的选取?

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

本文是[数据结构基础系列(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; //排序的记录类型定

数据结构复习:交换排序原理及C++实现

1. 交换排序的基本思想 两两比较key值,如果发生逆序(排列的顺序与期望的顺序相反)就交换,知道所有对象都排序完毕!常见的3种交换排序算法:冒泡排序,shaker排序和快速排序. 2. 冒泡排序 设待排序列中有 n 个对象, 首先比较对象v[n-1]和v[n-2], 如果v[n-1] < v[n-2],则交换v[n-1]和v[n-2],然后对v[n-i]和v[n-i-1]进行同样操作,知道对v[1]和v[0]进行完操作,每一次冒泡,使得值小的对象前移动,如此重复,直至有序,图解如下: 3.Sh

SDUT 3399 数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数. Input 连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔. Output

数据结构例程——交换排序之冒泡排序

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

SDUT-3399_数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数. Input 连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔. Output 输出数据占一行,代表冒泡排序

数据结构之——交换排序

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

[书]WALL&#183;E、龙与地下铁、中国美丽的故事、故事新编、四十自述、书虫、人工智能、大话数据结构

下午有时间,逛了逛了书城,看到了一些书.在这里总结一些自己的感受. 一.<龙与地下铁> 这本书是我首先看到的,就在靠前的新书区.是小说,我没看里面的内容,但是被书封皮的宣传文案给逗笑了 ---- 疲惫的老龙抱怨说,越过龙门十几年,现在,每天还是要坐地铁. 很显然,是本讽刺小说.长安城.大唐天子.龙门.老龙.坐地铁.体面的工作…… 体面的工作并没得到,老龙很疲惫. 二.<中国的美丽故事> 书名可能是这个.名字不起眼,甚至有点落俗,是给儿童读的故事书,故事都是采自民间. 结合书里的插图