数据结构复习:交换排序原理及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.Shaker排序(双向冒泡排序)

此种排序是对冒泡排序的改进,冒泡排序每次只能从一个方向进行遍历,而shaker排序每次遍历包括两个方向,先从前向后,再从后往前双向交替,效率上较冒泡排序有所改进,图解如下:

4.快速排序

快速排序采用的是一种分治的思想:取待排序对象序列中的某个对象为基准(任意取一个),按照其他对象与该基准对象的大小关系,将整个序列划分为左右两个子序列,其中左侧子序列中所有对象值都小于或者等于基准值,右侧对象序列中的所有对象值都大于基准值,然后对左右这两个子序列重复上述操作(递归),直至子序列为空为止!还是比较容易理解,这里就不画图了。

5.C++实现

  1 #ifndef EXCHANGESORT_H
  2 #define EXCHANGESORT_H
  3 #include <vector>
  4 #include <iostream>
  5 using std::vector;
  6 using std::cout;
  7 using std::endl;
  8 template <typename T>
  9 class ExchangeSort
 10 {
 11 private:
 12     int len;
 13     vector<T> list;
 14 public:
 15     /*
 16      * Construction function
 17     */
 18     ExchangeSort(vector<T> _list, int _len)
 19     {
 20         for (int i = 0; i < _len; ++i) list.push_back(_list[i]);
 21         this->len = _len;
 22     }
 23
 24     /*
 25     * bubbleSort functions
 26     */
 27     void bubbleSort()
 28     {
 29         for (int i = 0; i < len; ++i)
 30             for (int j = i + 1; j < len; ++j)
 31                 if (list[i] > list[j]) swap(i, j);
 32     }
 33
 34     /*
 35     * shakerSort functions
 36     */
 37     void shakerSort()
 38     {
 39         int i, left = 0;
 40         int shift = 0;
 41         int right = len - 1;
 42         while (left < right)
 43         {
 44             for (i = left; i < right; ++i) // From left to right
 45             {
 46                 if (list[i] > list[i + 1])
 47                 {
 48                     swap(i, i + 1);
 49                     shift = i;// Record the last index
 50                 }
 51             }// end for
 52             right = shift;
 53             for (i = right; i > left; --i)//From right to left
 54             {
 55                 if (list[i] < list[i - 1])
 56                 {
 57                     swap(i, i - 1);
 58                     shift = i;
 59                 }
 60             }// end for
 61             left = shift;
 62         }//end while
 63     }
 64
 65
 66
 67     /*
 68     * quick sort
 69     */
 70     void quickSort(int left, int right)
 71     {
 72         int i = left;
 73         int j = right;
 74         int pivot = list[left];
 75         while (i < j)
 76         {
 77             while (i < j && list[j] >= pivot) --j; // Search the number less than pivot
 78             if (i < j) swap(i, j);
 79             while (i < j && list[i] <= pivot) ++i; // Search the number larger than pivot
 80             if (i < j) swap(i, j);
 81         }
 82         if (i != left) quickSort(left, i - 1);
 83         if (j != right) quickSort(j + 1, right);
 84     }
 85     /*
 86     * Exchange two elements of list
 87     */
 88     void swap(int i, int j)
 89     {
 90         T temp = list[i];
 91         list[i] = list[j];
 92         list[j] = temp;
 93     }
 94
 95     /*
 96     * Display the sorted result
 97     */
 98     void out()
 99     {
100         for (int i = 0; i < len; ++i)
101         {
102             cout << list[i] << " ";
103             if ((i + 1) % 18 == 0) cout << endl;
104         }
105         cout << endl;
106     }
107 };
108
109 #endif
110
111
112 //exchangeSortTest
113 #include "ExchangeSort.h"
114 #include <vector>
115 using namespace std;
116
117 const unsigned numEle = 8;
118 int data[numEle] = {1,5,7,3,8,2,6,4};
119
120
121 int main()
122 {
123     vector<int> testData;
124     for (unsigned i = 0; i < numEle; ++i) testData.push_back(data[i]);
125
126     ExchangeSort<int> testBubble(testData, numEle);
127     cout << "Before sorting: ";
128     testBubble.out();
129     testBubble.bubbleSort();
130     cout << "After sorting with bubbleSort: ";
131     testBubble.out();
132
133
134     ExchangeSort<int> testShaker(testData, numEle);
135     cout << "Before sorting: ";
136     testShaker.out();
137     testShaker.shakerSort();
138     cout << "After sorting with shakerSort: ";
139     testShaker.out();
140
141     ExchangeSort<int> testQuick(testData, numEle);
142     cout << "Before sorting: ";
143     testQuick.out();
144     testQuick.quickSort(0, numEle-1);
145     cout << "After sorting with testQuick: ";
146     testQuick.out();
147
148     return 0;
149 }

6.参考文献

左飞:C++数据结构原理与经典问题求解

时间: 2024-08-11 07:49:12

数据结构复习:交换排序原理及C++实现的相关文章

数据结构复习之--“插入排序”-JAVA实现

菜鸟中的菜鸟一枚,面临找工作,复习下数据结构,写的插入排序算法记录一下,每天写一点,不断积累吧! import java.util.Scanner; /** * * @author DL * 数据结构复习之插入排序练习程序 * */ public class SortTest { public static void main(String [] args){ Scanner sc = new Scanner(System.in); int totalNums = sc.nextInt();//

隐匿在数据结构背后的原理

无论你是信息技术的从业人员,还是计算机专业的在校学生,再或者是从事相关专业的研究人员,熟练掌握一门计算机语言的重要性都不言而喻.但是不是掌握了这其中的语法规则就能写出漂亮的程序了呢?答案当然是否定的.因为你还需要另外一样至少同等重要的工具--算法.算法和语言的关系,其实很像是"道"和"术"的关系.掌握一门语言,就如同习得一门技艺,可以成为一名工匠.但要想从工匠一跃成为大师,单单停留在"术"的层面显然不够,更重要的是悟"道".而

算法改变世界——《算法之美——隐匿在数据结构背后的原理(C++版)》

所谓算法,就是隐匿在数据结构后背后的原理,在开发中好的算法可以降低时间复杂度提升可复用性.<算法之美--隐匿在数据结构背后的原理(C++版)>一书围绕算法与数据结构这个话题,用汉诺塔问题和八皇后问题等22个经典算法问题循序渐进.深入浅出地介绍了现代计算机技术中常用的45个经典算法.读后让人醍醐灌顶,茅塞顿开,并感觉相见恨晚. 这本书的第六章<递归--老和尚讲故事>写的很好,首先介绍了递归的概念,然后用汉诺塔问题,传染病问题和八皇后问题分别阐述并实践了递归的两种思想--分治和回溯.

CodingLabs - MySQL索引背后的数据结构及算法原理

原文:CodingLabs - MySQL索引背后的数据结构及算法原理 首页 | 标签 | 关于我 | +订阅 | 微博 MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注

【数据结构】HashMap原理及实现学习总结

HashMap是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构.本篇主要是从HashMap的工作原理,数据结构分析,HashMap存储和读取几个方面对其进行学习总结.关于HashMap的完整源码分析请查看下一篇. 一. HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象.当获取

数据结构复习---顺序表和单链表

1.前言: 最近比较浮躁,想学习一门新的技术却总是浅尝辄止,遇到不懂的地方就想跳过去,时间长了,心态就有点崩了.静下心来,去喝了几碗心灵鸡汤.鸡汤博主感动到了我:"无专注,无风景.不要太贪心,一次只做一件事,而且只做最重要的事.".于是乎,我把家里翻了个底朝天,找到了我垫在床底下的<数据结构>这本书,觉得自己是时候静下心来好好复习一下基础了.今天刚看到顺序表和链表,把我的学习心得记录在这里.也希望自己能坚持,老老实实的把这本书复习完. 2.数据结构的重要性: 讲一门知识之前

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2

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

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

MySQL索引背后的数据结构及算法原理

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎 对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索 引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干