您的位置:首页 > 理论基础 > 数据结构算法

排序 (插入排序,快速排序,希尔排序)数据结构与算法分析-C语言描述

2017-08-08 21:43 423 查看

排序学习笔记

插入排序:

所谓的直接插入排序,是在一个已经排好序的序列里面再插入一个数据,看看他是应该插入到什么地方。

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;
}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构
相关文章推荐