class SortOp
{ //插入排序
private static void InsertSort(int[] list,int low,int high)
{
for (int i = low; i < high; i++)
{
int t = list[i];
int j = i;
while ((j > 0) && (list[j - 1] > t))
{
list[j] = list[j - 1];
--j;
}
list[j] = t;
}
}
private static void Swap(ref int i, ref int j)
//只有两个元素时直接交换
{
int t;
t = i;
i = j;
j = t;
}
//快速排序优化
public static void QuickSort(int[] list, int low, int high,int k)
{
//只剩下一个无需交换
if (high <= low)
{
return;
}
else if (high == low + 1)
{
//只剩下两个直接交换
if (list[low] > list[high])
{
Swap(ref list[low], ref list[high]);
return;
}
}
//大于三个元素开始优化的快速排序
myQuickSort(list, low, high,k);
}
public static void myQuickSort(int[] list, int low, int high,int k)
{
if (low < high)
{
if(high-low<k) //子序列小于k个使用插入排序
{
InsertSort(list,low,high);
}
else{
int pivot = Partition(list, low, high);
myQuickSort(list, low, pivot - 1,k);
myQuickSort(list, pivot + 1, high,k);
}
}
}
private static int Partition(int[] list, int low, int high)
{
int pivot;
pivot = list[low];
while (low < high)
{
while (low < high && list[high] >= pivot)
{
high--;
}
if (low != high)
{
Swap(ref list[low], ref list[high]);
low++;
}
while (low < high && list[low] <= pivot)
{
low++;
}
if (low != high)
{
Swap(ref list[low], ref list[high]);
high--;
}
}
return low;
}
}
{
int i,j,sign,tmp;
/* 有可能造成start>end 因为递归调用时j+1,可能引起j比end还大1。 另外如果数组是空的,或者输入错误也会出现这种情况*/
if(end<=start)
{
return;
}
else
{
/* 取中间元素为中心点,然后移到最右边 */
sign=(start+end)/2;
tmp=array[end];
array[end]=array[sign];
array[sign]=tmp;
j=start;
for(i=start;i<=end-1;i++)
{
/* 小于的元素和标记互换,等于的不能互换,否则会形成死循环 */
if(array[i]<array[end])
{
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
j=j+1;
}
}
/* 把标记元素和第一个>=它的元素位置互换,这样数组就分成2个部分,一个部分比中心值小,一个部分比中心值大 */
tmp=array[j];
array[j]=array[end];
array[end]=tmp;
quickSort(array,start,j);
quickSort(array,j+1,end);
}
}