//插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
//直接查找排序
void direct_sort(int* list,int lenth)
{
for(int i=1;i<lenth;i++)//循环从第2个元素开始
{
if(list[i]>list[i-1])
{
int temp=list[i]; //哨兵
int j = 0;
for(j=i-1;j>=0 && list[j]<temp;j--)//list[j]<temp 防止越界哨兵
{
//直接插入排序从尾结点边比较边移动元素,
//而并非等找到插入点后再移动元素.所以从尾结点开始向头结点找插入点则效率更好.
//符合要求的有序数组后移一位
list[j+1]=list[j];
}
list[j+1]=temp;//哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;
}
printf("第%d趟:",i);
for (int i = 0; i< lenth; i++)
{
printf("%d ",list[i]);
}
printf("\n");
}
}
//半分查找排序
void binary_search_sort(int* list,int lenth)
{
int outer, inner;
//outer loop
for (outer = 1; outer < lenth; outer++)
{
int temp = list[outer]; 哨兵
int low = 0, high = outer; //已经排好序的数组的上下界
//在已经排好序的的数组中进行半分查找
while (low <= high)
{
int mid = (low + high) / 2; //折半数组
if (temp < list[mid])
low = mid + 1; //需要插入的数组在右边
else
high = mid - 1; //需要插入的数组在左边
}
//右边的数组右移一位
for (int j = outer - 1; j > high; j--)
{
list[j + 1] = list[j];
}
//将待排序组插入
list[high + 1] = temp;
printf("第%d趟:",outer);
for (int i = 0; i< lenth; i++)
{
printf("%d ",list[i]);
}
printf("\n");
}
}
//希尔排序的基本思想是:
//把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
//随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
void shell_sort(int* list,int lenth)
{
int gap = lenth / 2;
int i = 0;
while (1 <= gap)
{
// 把距离为 gap 的元素编为一个组,扫描所有组
for (int i = gap; i < lenth; i++)
{
int j = 0;
int temp = list[i];//哨兵
// 对距离为 gap 的元素组进行直接插入排序
for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap)
{
list[j + gap] = list[j];
}
list[j + gap] = temp; //哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;
}
printf("第%d趟:",i);
for (int i = 0; i< lenth; i++)
{
printf("%d ",list[i]);
}
printf("\n");
gap = gap / 2; // 减小增量
i++;
}
}
插入排序
最新推荐文章于 2023-09-23 17:47:53 发布