数据结构与算法:C++实现快速排序
2016-05-09 13:35
489 查看
快速排序
思想:先找到一个切分点,然后使大于它的放后面,小于它的放前面。切分将一个较大的随机数组分成两个随机子数组。
优点:比较次数较少。
改进算法:三向切分快速排序
将数组切分成三个部分,分别是大于、小于和等于切分元素的数组元素,适用于重复元素较多的数组。
思想:先找到一个切分点,然后使大于它的放后面,小于它的放前面。切分将一个较大的随机数组分成两个随机子数组。
优点:比较次数较少。
#include<iostream> using namespace std; void swap(int& a, int& b) { int t = a; a = b; b = t; } int Parition(int* a, int from, int to) { int h = from + 1; int l = to; int v = a[from]; int t = 0; while (true) { while (v >= a[h]) // 从左向右扫描找出比v大的那个位置 { h++; if (h == to) break; } while (v <= a[l]) // 从右向左扫描找出比v小的那个位置 { l--; if (l == from) break; } if (h >= l) break; swap(a[h], a[l]); // 交换这两个位置 } swap(a[l], a[from]); // 切分元素和左子数组的最右元素交换 return l; } void QuickSort(int* a, int from, int to) { if (from >= to) return; int key = Parition(a, from, to); QuickSort(a, from, key - 1); QuickSort(a, key + 1, to); } int main() { int a[] = { 12, 2, 3, 43, 5, 46, 74, 28, 30, 19, 11, 9 }; int n = sizeof(a) / sizeof(int); QuickSort(a, 0, n - 1); for (int i = 0; i < n; i++) cout << a[i] << " "; cout << endl; return 0; }
改进算法:三向切分快速排序
将数组切分成三个部分,分别是大于、小于和等于切分元素的数组元素,适用于重复元素较多的数组。
void Quick3way(int* a, int from, int to) { if (from >= to) return; int h = from; //小于切分元素的下标 int l = to; int i = from + 1; // 等于切分元素的下标 int v = a[from]; // 大于切分元素的下标 while (i <= l) { if (v > a[i]) //当a[i] < v 时, 交换这两个元素,相应的下标都往下移一位 { swap(a[h], a[i]); h++; i++; } else if (v < a[i]) //当a[i] > v 时, a[i]与最后的元素交换,使最后元素的下标往前移一位 { swap(a[l], a[i]); l--; } else //当a[i] = v 时, 只有i往前移一位,其余不变 i++; } Quick3way(a, from, h - 1); Quick3way(a, l + 1, to); }
相关文章推荐
- 数据结构-非线性-树-二叉树
- 数据结构:链表(linked-list)
- ortp中的queue_t,msgb(mblk_t)和datab(也适用于solaris驱动所使用的数据结构)
- [Java数据结构]从源码分析HashMap
- 数据结构与算法分析(一) —— 数学基础
- 数据结构_线性表_顺序队列_循环队列_链队列
- 数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例
- 数据结构_线性表_链式存储_双向循环链表的基本操作
- 数据结构的栈和堆
- java实现最大堆数据结构
- java中一些容器底层的数据结构解析
- 数据结构与算法练习-递归
- VIJOS1986 小h的妹子树二
- 数据结构 笔记2 线性表
- VIJOS 1923 漫长的等待
- 数据结构(12):图 深度优先遍历(DFS)
- Java千百问_06数据结构(013)_数组如何传递
- 位运算-Single Number (求一个给定数组的出现次数为单数的那个数)
- 数据结构——排序算法
- 数据结构与算法:C++实现归并排序