仅作为记录,有空可以温故
使用了三种选择pivot的策略,前两种分别是1、选择第一个元素作为pivot;2、选择最后一个元素作为pivot;3、选择前、中、后三个元素中大小中等的元素作为pivot。其中前两种在注释里。
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <ctime>
usingnamespace std;
unsigned longint comparNum = 0;
constint MAXN = 10000;
void QuickSort(int A[], int low, int high);
int Median3( int A[], int low, int high);
int Partition(int A[], int low, int high);
void swap( int *, int *);
int main()
{
//read file,initial a integer vector
time_t begin,end;
begin = clock();
ifstream fin("QuickSort");
string cArr[MAXN];
int arr[MAXN];
for (int i = 0; i < MAXN; ++i)
{
getline(fin, cArr[i]);
arr[i] = atoi(cArr[i].c_str());
}
fin.close();
QuickSort(arr, 0, MAXN - 1);
cout << "The number of comparisons is: " << comparNum <<endl;
end = clock();
cout << "The running time is:" << double(end - begin)/CLOCKS_PER_SEC <<endl;
return 0;
}
void QuickSort(int A[], int low, int high)
{
if (low >= high)
return;
elseif (high - low == 1)
{
comparNum += 1;
if(A[ low ] > A[ high ])
swap(&A[ low ], &A[ high ]);
}
else
{
int pivot_loc = Partition(A, low, high);
QuickSort(A, low, pivot_loc - 1);
QuickSort(A, pivot_loc + 1, high);
}
}
int Partition(int A[], int low, int high)
{
//#1
//int pivot = A[low];
//#2
//int pivot = A[high];
//swap(&A[low], &A[high]);
//#3
int pivot = Median3( A, low, high);
int i = low+1;
int j = low+1; //the most left
for (; j <= high; ++j) {
if ( A[j] < pivot) {
swap( &A[j], &A[i]);
++i;
}
}
swap(&A[low], &A[i-1]);
comparNum += high - low;
return (i-1);
}
void swap( int *a, int *b)
{
int c = *a;
*a = *b;
*b = c;
}
int Median3( int A[], int low, int high)
{
int center = (low + high) / 2;
int temp[3] = {A[ low ], A[ center ], A[ high ]};
if (temp[0] > temp [1])
swap(&temp[0], &temp[1]);
if (temp[0] > temp [2])
swap(&temp[0], &temp[2]);
if (temp[1] > temp [2])
swap(&temp[1], &temp[2]);
//Invariant: temp[0] <= temp[1] <= temp[2]
if (A[ center ] == temp[ 1 ])
swap(A[ center ], A[ low ]);
elseif (A[ high ] == temp[ 1 ])
swap(A[ high ], A[ low ]);
return A[ low ];
}
51的自动打乱排版功能非常不错。
转载于:https://blog.51cto.com/hector/816134