A. quick sort
#include <stdio.h>
#include <stdlib.h>
#define cutoff 3
void insertSort(int a[], int left, int right);
void Qsort(int a[], int left, int right);
int mid3(int a[], int left, int right);
void swap(int *a, int *b);
int main()
{
int index;
scanf("%d", &index);
int a[10] = {49, 38, 65, 97, 76, 13, 27, 50, 2, 8};
int i, j;
int temp;
int pivot;
pivot = a[index];
temp = a[index];
a[index] = a[9];
a[9] = temp;
i = -1;
j = 9;
for (;;)
{
while (a[++i] < pivot)
{
}
while (a[--j] > pivot)
{
}
if (i < j)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
else
{
break;
}
}
temp = a[i];
a[i] = a[9];
a[9] = temp;
printf("Qsort(0,9):");
for (int k = 0; k < 10; k++)
{
printf("%d,", a[k]);
}
printf("\n");
Qsort(a, 0, i - 1);
Qsort(a, i + 1, 9);
return 0;
}
int mid3(int a[], int left, int right)
{
int center = (left + right) / 2;
int temp;
if (a[left] > a[right])
{
temp = a[left];
a[left] = a[right];
a[right] = temp;
}
if (a[left] > a[center])
{
temp = a[left];
a[left] = a[center];
a[center] = temp;
}
if (a[center] > a[right])
{
temp = a[center];
a[center] = a[right];
a[right] = temp;
}
temp = a[center];
a[center] = a[right - 1];
a[right - 1] = temp;
return a[right - 1];
}
void Qsort(int a[], int left, int right)
{
int pivot;
int i, j;
int temp;
if (left + cutoff <= right)
{
pivot = mid3(a, left, right);
i = left;
j = right - 1;
for (;;)
{
while (a[++i] < pivot)
{
}
while (a[--j] > pivot)
{
}
if (i < j)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
else
{
break;
}
}
temp = a[i];
a[i] = a[right - 1];
a[right - 1] = temp;
printf("Qsort(%d,%d):", left, right);
for (int k = 0; k < 10; k++)
{
printf("%d,", a[k]);
}
printf("\n");
Qsort(a, left, i - 1);
Qsort(a, i + 1, right);
}
else
{
insertSort(a, left, right);
}
}
void insertSort(int a[], int left, int right)
{
int temp;
int i, j;
for (i = left; i <= right; i++)
{
temp = a[i];
for (j = i; j >= 1 && temp < a[j - 1]; j--)
{
a[j] = a[j - 1];
}
a[j] = temp;
}
printf("insert(%d,%d):", left, right - left + 1);
for (int k = 0; k < 10; k++)
{
printf("%d,", a[k]);
}
printf("\n");
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
第二版:
#include <stdio.h>
void swap(int *a, int *b);
int med3(int a[], int left, int right);
void Qsort(int a[], int left, int right);
void insertSort(int a[], int left, int right);
int main()
{
int a[10] = {49, 38, 65, 97, 76, 13, 27, 50, 2, 8};
int index;
scanf("%d", &index);
int pivot = a[index];
swap(&a[index], &a[9]);
int i, j;
/
i = -1; //第一次检查 要从第一个元素 下标为0的开始!!!!!
j = 9;
for (;;)
{
while (a[++i] < pivot) //别写反了
{
};
while (a[--j] > pivot)
{
};
if (i < j)
{
swap(&a[i], &a[j]);
}
else
{
break;
}
}
//retore the pivot
swap(&a[i], &a[9]);
printf("Qsort(0,9):");
for (int i = 0; i < 10; i++)
{
printf("%d,", a[i]);
}
printf("\n");
/
Qsort(a, 0, i - 1);
Qsort(a, i + 1, 9);
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void Qsort(int a[], int left, int right)
{
//要理解Qsort函数的整体结构:总体上分为两大部分 元素数量较多的快速排序和
// 元素较少是cutoff时的 插入排序,第一个if中包括的内容很多
int pivot;
int i, j;
if (left + 3 <= right)
{
i = left;
j = right - 1;
pivot = med3(a, left, right);// 一定在第一个if的里面!!!!!!!!!
for (;;)
{
while (a[++i] < pivot) //别写反了
{
};
while (a[--j] > pivot)
{
};
if (i < j)
{
swap(&a[i], &a[j]);
}
else
{
break;
}
}
//retore the pivot
swap(&a[i], &a[right - 1]);
printf("Qsort(%d,%d):", left, right);
for (int i = 0; i < 10; i++)
{
printf("%d,", a[i]);
}
printf("\n");
Qsort(a, left, i - 1);
Qsort(a, i + 1, right);
}
else
{
insertSort(a, left, right);
}
}
int med3(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]);
}
//hide the pivot
swap(&a[center], &a[right - 1]);
return a[right - 1];
}
void insertSort(int a[], int left, int right)
{
int i, j;
int temp;
for (i = left; i <= right; i++)
{
temp = a[i];
for (j = i; j >= 1 && temp < a[j - 1]; j--) //一定是j>=1
{
a[j] = a[j - 1];
}
a[j] = temp; //这里一定是j 上次机考就在这里翻车了!!
}
printf("insert(%d,%d):", left, right - left + 1);
for (int k = 0; k < 10; k++)
{
printf("%d,", a[k]);
}
printf("\n");
}