快速排序{不同方法寻找分割元素}
2011-10-06 00:00
246 查看
本文主要阐述快速排序中分割元素的划分。
#include <iostream> using namespace std; //Swap交换函数,若用异或则要注意判断a==b? //若用加减法,则要注意防止溢出现象。综合看判断+异或较好。 void Swap(int &a, int &b) { if (a == b) { return; } a = a^b; b = a^b; a = a^b; } //第一种分割办法,算法导论上快速排序即采用此方法 //从一端开始寻找分割点 /* 示意图 [low-----i-------j------high] i:指示的是当前从l~i之间都是小于或等于 x=data[high]; j:i~j之间的都是 大于或等于x 最后将i+1位置的元素和主元x交换,则主元被交换到i+1位置,则i+1就成了分割位置 */ //**************做了随机化处理****************** int Partition1(int data[],int low, int high) { int k = low + rand() % (high-low+1);//做下随机处理 //为了取得low~high内平均,必须mod(high-low + 1) Swap(data[k],data[high]); //因为主元是选择最后一个元素 int pivot = data[high]; int i=low-1;//i记录的是比主元小的元素的下标上限。初始为low-1 for (int j=low;j<high;j++) { if (data[j] <= pivot)/*容易把等号丢掉*/ { //有比主元小或等于主元的元素,则i++ i++; Swap(data[i], data[j]);//可能存在自己和自己交换 } } /*Swap(data[i+1], pivot);*///这里容易写错 Swap(data[i+1], data[high]); return i+1; } /*第2种写法和第3种写法,都选取low位置元素为主元 且这两种写法都是从两端开始寻找分割点 */ //分割元素写法2 //第二种分割办法 int Partition2(int data[], int low, int high) { int i=low;//i从左端往右 int j=high;//j从右端往左 int pivot = data[low];//选取low位置处为主元 while(i<j) { //找第一个比pivot小的元素 while(data[j] >= pivot && i<j)//当i==j时就停止 j--; data[i] = data[j]; //找第一个比pivot大的元素 while(data[i] <= pivot && i<j)//当i==j时也停止了 i++; data[j] = data[i]; } data[i] = pivot;//i和j相等位置即为分割点。 return i; } //分割元素第三种写法 //参考陈慧楠老师<<数据结构>> int Partition3(int data[], int low, int high) { int i,j; i = low;//令l为主元值 j = high+1; int pivot = data[low]; if (low < high) { do { do i++; while(data[i] < pivot && i <= high);//避免越界 do j--; while(data[j] > pivot );//因为无论如何会有data[j] == data[i]处结束 if (i<j) Swap(data[i], data[j]); } while (i<j); } Swap(data[low], data[j]); return j; } int Partition4(int data[], int low, int high) { int i,j; i = low;//令l为主元值 j = high; int pivot = data[low]; if (low < high) { while(i<j) { while(data[i] <= pivot && i<high) i++; while(data[j] >= pivot && j>low ) j--; if(i<j) Swap(data[i], data[j]); } } Swap(data[low], data[j]); return j; } void QSort(int data[], int low, int high) { if (low<high)//没有等于号 { //int k = Partition1(data, low, high);//分割元素 //int k = Partition2(data, low, high);//分割元素 //int k = Partition3(data, low, high);//分割元素 int k = Partition4(data, low, high);//分割元素 QSort(data, low, k-1); QSort(data, k+1, high); } } void QuickSort(int data[], int n)//在用户端容易调用 { QSort(data,0,n-1); } int main() { int array[10] = {1,3,41,2,23,121,1231,123,12,5};// QuickSort(array,10); for (int i=0;i<10;i++) { cout<<array[i]<<endl; } return 1; }
相关文章推荐
- 寻找最小的k个数(先快速排序,然后输出前k个元素)
- 快速排序-几种不同的划分方法
- 快速排序的不同语言不同方法实现的…
- 快速排序的不同语言不同方法实现的…
- 快速排序的不同语言不同方法实现的…
- 快速排序基于不同枢纽的实现方法
- 给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。
- 给一个由n-1个整数组成的未排序的序列,其元素都是1~n中的不同的整数。如何在线性时间复杂度内寻找序列中缺失的整数
- PHP分割两个数组的相同元素和不同元素的两种方法
- 快速掌握PHP多维数组排序方法
- 使用sortedArrayUsingSelector:方法排序数组中的元素
- iOS开发数组去重方法,排序去重和包含元素
- Java - TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
- javascript 获取元素位置的快速方法 getBoundingClientRect()
- 对二维数组进行快速排序的 方法
- 快速排序三种实现方法
- Python快速过滤Numpy数组中特定元素的方法
- 用sort()方法对数组的元素进行排序(可按字母升序降序与获得最大最小值)
- 比较一个数组中,是否有相等的元素的不同方法比较
- 快速排序方法Java实现与分析