#pragma once
#include<stdio.h>
void InsertSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)
{
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
--end;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
#pragma once
#include<stdio.h>
#include"Insertsort.h"
void Swap3(int* a1, int* a2)
{
int tmp = *a1;
*a1 = *a2;
*a2 = tmp;
}
int GetMinindex(int* a, int left, int right)
{
int mid = (left + right) / 2;
if (a[left] < a[mid])
{
if (a[mid] < a[right])
{
return mid;
}
else if (a[left] > a[right])
{
return left;
}
else
{
return right;
}
}
else
{
if (a[mid] > a[right])
{
return mid;
}
else if (a[left] < a[right])
{
return left;
}
else
{
return right;
}
}
}
int quickSort1(int* a, int left,int right)
{
int index = GetMinindex(a, left, right);
Swap3(&a[left], &a[index]);
int begin = left;
int end = right;
int pivot = begin;
int key = a[begin];
while (begin < end)
{
while (begin < end && a[end] >= key)
--end;
a[pivot] = a[end];
pivot = end;
while (begin < end && a[begin] <= key)
++begin;
a[pivot] = a[begin];
pivot = begin;
}
pivot = begin;
a[pivot] = key;
return pivot;
}
int quickSort2(int* a, int left, int right)
{
int index = GetMinindex(a, left, right);
Swap3(&a[left], &a[index]);
int begin = left;
int end = right;
int keyi = a[begin];
while (begin < end)
{
while (begin < end && a[end] >= a[keyi])
{
--end;
}
while (begin < end && a[begin] <= a[keyi])
{
++begin;
}
Swap3(&a[begin], &a[end]);
}
Swap3(&a[begin], &a[keyi]);
return begin;
}
int quickSort3(int* a, int left, int right)
{
int index = GetMinindex(a, left, right);
Swap3(&a[left], &a[index]);
int keyi = left;
int pre = left;
int cur = left+1;
while (cur <= right)
{
if (a[cur] < a[keyi])
{
++pre;
Swap3(&a[pre], &a[cur]);
}
++cur;
}
Swap3(&a[keyi], &a[pre]);
return pre;
}
void quickSort(int* a, int left, int right)
{
if (left >= right)
return;
int keyindex = quickSort3(a, left, right);
if (keyindex - 1 - left > 10)
quickSort(a, left, keyindex - 1);
else
InsertSort(a + left, keyindex - 1 - left + 1);
if( right - (keyindex+1) > 10)
quickSort(a, keyindex + 1, right);
else
InsertSort(a + keyindex + 1, right-(keyindex + 1) + 1);
}
void test()
{
int a[] = { 6,8,4,5,0,12,9,8,7,62,1,44,56,6 };
int sz = sizeof(a) / sizeof(int);
quickSort(a, 0,sz-1);
printA(a, sz);
}
int main()
{
test();
return 0;
}