数据结构复习:交换排序原理及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++数据结构原理与经典问题求解
请尊重原创知识,本人非常愿意与大家分享
转载请注明出处:http://www.cnblogs.com/90zeng/
作者:博客园-90Zeng