排序学习笔记
插入排序:
所谓的直接插入排序,是在一个已经排好序的序列里面再插入一个数据,看看他是应该插入到什么地方。
insertionSort(int *arr, int left, int right)
{
int Len = right - left+1;
int tmp,j;
for (int i = left; i <= right; i++)
{
tmp = *(arr + i);
for (j = i; j > 0 && tmp < *(arr + j - 1); j--) //如果这个新插入的数据很小,那么从就j开始逐渐往前取代,最终能够找到合适的位置。
*(arr + j) = *(arr + j - 1);
*(arr + j) = tmp; //在多次--后的j处放上tmp。
}
}
快速排序,这个快速排序是我自己写的:
#define Cutoff 3 //主要考虑到pivot的选择算法导致在小组中元素个数少于3个时,只能使用插入排序。
void
insertionSort(int *arr, int left, int right)
{
int Len = right - left+1;
int tmp,j;
for (int i = left; i <= right; i++)
{
tmp = *(arr + i);
for (j = i; j > 0 && tmp < *(arr + j - 1); j--)
*(arr + j) = *(arr + j - 1);
*(arr + j) = tmp;
}
}
int
media3(int *arr, int left, int right) //得到中位数,用来做为pivote,三个数据分别来自于数组的左端,中位数,和最右端,并且程序将这三个数进行了排序。
{
int center = (left + right) / 2;
if (*(arr + left) > *(arr + center))
swap(*(arr + left), *(arr + center));
if (*(arr + left) > *(arr + right))
swap(*(arr + left), *(arr + right));
if (*(arr + center) > *(arr + right))
swap(*(arr + center), *(arr + right));
swap(*(arr + center), *(arr + right));
return *(arr + right);
}
void
Qsort(int *arr, int left, int right) //快速排序的主函数。
{
if (left + Cutoff <= right) //判断是否需要采用插入排序
{
int pivot = media3(arr, left, right);
cout << pivot << endl;
int i = left, j = right - 1;
for (;;)
{
while (*(arr + ++i) < pivot); //快速找到比pivot大的位置
while (*(arr + --j) > pivot); //快速找到比pivot小的位置
if (i < j)
swap(*(arr + i), *(arr + j));//交换这i ,j两个位置
else
break;
}
for (int i = 0; i <= 9; i++) //测试使用的
{
cout << *(arr + i) << " ";
}
cout << endl;
swap(*(arr + i), *(arr + right)); //交换i和pivot的位置。
for (int i = 0; i <= 9; i++) //测试使用的
{
cout << *(arr + i) << " ";
}
cout << endl;
Qsort(arr, left, i - 1); //继续递归Qsort()
Qsort(arr, i + 1, right);
}
else
insertionSort( arr, left, right); //使用直接插入函数
}
int main()
{
int arr[] = { 8,1,4,9,16,3,5,22,7,23 };
Qsort(arr, 0, 9);
for (int i = 0; i <= 9; i++)
{
cout << *(arr + i) << " ";
}
return 0;
}
测试结果: