#include <iostream> #include <stdio.h> using namespace std; int N = 10; int cnt = 0; int First_pivot;
void Swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void Qsort(int a[], int left, int right); int Median3(int a[], int left, int right); void InsertionSort(int a[], int left, int right);
int main() { int a[10] = {49,38,65,97,76,13,27,50,2,8}; cin>>First_pivot; Qsort(a, 0, 9); } void Qsort(int a[], int left, int right) { if(cnt==0) { printf("Qsort(%d,%d):",left,right); int pivot=a[First_pivot]; Swap(&a[First_pivot],&a[9]); int i=0,j=8; for (;;) {
while (a[i] < pivot) {i++;}
while (a[j] > pivot) {j--;}
if (i < j) { Swap(&a[i],&a[j]); } else break; } Swap(&a[i],&a[9]); cnt++; for (int k = 0; k < N; k++)cout << a[k] << ','; cout << '\n'; Qsort(a, left, i - 1); Qsort(a, i + 1, right); } else{ int i, j; int Pivot; if (left + 2 < right) { printf("Qsort(%d,%d):",left,right); Pivot = Median3(a, left, right); i = left; j = right - 1;
for (;;) {
while (a[++i] < Pivot) {}
while (a[--j] > Pivot) {}
if (i < j) { Swap(&a[i],&a[j]); } else break; } Swap(&a[i],&a[right-1]); for (int k = 0; k < N; k++)cout << a[k] << ','; cout << '\n'; Qsort(a, left, i - 1); Qsort(a, i + 1, right); } else { InsertionSort(a + left, left, right); for (int k = 0; k < N; k++)cout << a[k] << ','; cout << '\n'; }} }
int Median3(int a[], int left, int right) { int center = (left + right) / 2;
if (a[left] > a[center]) Swap(&a[left], &a[center]);
if (a[left] > a[right]) Swap(&a[left], &a[right]);
if (a[center] > a[right]) Swap(&a[center], &a[right]); Swap(&a[center], &a[right - 1]); return a[right - 1]; }
void InsertionSort(int a[], int left, int right) { int j; int n = right - left + 1;
printf("insert(%d,%d):",left,n); for (int i = 1; i < n; i++) {
int temp = a[i];
for (j = i; j > 0 && a[j - 1] > temp; j--) {
a[j] = a[j - 1]; }
a[j] = temp; } }
|