直接插入排序指的是先将一小部分排好序,然后从未排序的元素中找一个出来.遍历已排序好的数组,插入到合适位置.
直接插入排序:
void StraightInsertSort(int* arr, int len)
{
int tmp;
int j;
for(int i = 1; i < len; i++)
{
tmp = arr[i];
for(j = i-1; j >=0 ; j --) //遍历已经排好序的部分,找到合适的位置j + 1
{
if( arr[j] >= tmp)
break;
}
for(int k = i; k > j + 1; k--) //把位置j + 1后面的元素右移
{
arr[k] = arr[k -1];
}
arr[j + 1] = tmp; //插入元素到位置j+1
}
}
我们看到在从已经排好序的数组中找合适的位置的时候可以改进一下,用下二分查找的方法.
改进的插入排序算法:
void BinaryInsertSort(int* arr, int len)
{
int tmp;
int j;
for(int i = 1; i < len; i++)
{
tmp = arr[i];
int left = 0;
int right = i - 1;
while(left <= right) //通过二分查找找到合适的插入位置
{
int mid = (left + right)/2;
if( tmp == arr[mid])
{
j = mid;
break;
}
else if( tmp < arr[mid])
right = mid -1;
else if( tmp > arr[mid])
left = mid + 1;
}
if(left > right)
j = left - 1;
for(int k = i; k > j + 1; k--) //把位置j + 1后面的元素右移
{
arr[k] = arr[k -1];
}
arr[j + 1] = tmp; //插入元素到位置j+1
}
}
希尔排序(shell sort)
当数组中的元素基本有序的时候采用直接插入排序效率非常高,根据这个思路产生了一个改进的插入排序算法,希尔排序.
大体思路是先把整个待排序元素序列分割成若干子序列(由相隔的增量组成)分别采用直接插入排序,这样每排一次元素就变得更有序,然后增量缩小再接着重复上面的操作.
比如按增量5,3,1,0分别进行插入排序.当增量是1时就相当于对整个数组采取直接插入排序了.
你可能会好奇这个增量是怎么确定的? 这就存在很多不同的方法了,一般用的较多较容易的就是直接用数组长度n除以2,然后把结果继续除2.
void ShellSort(int* arr, int len)
{
for( int gap = len/2;gap > 0; gap = gap/2) //通过不同的增量来使数组一步步达到更有序的状态
for( int i = 0; i < gap; i ++)
{
for(int j = i + gap; j < len; j = j + gap) //对每个增量产生的子序列进行插入排序
if( arr[j] < arr[j - gap])
{
int tmp =arr[j];
int k ;
for( k = j - gap; k >= 0; k = k - gap)
{
if( tmp < arr[k])
arr[k + gap] = arr[k];
else
break;
}
arr[ k +gap] = tmp;
}
}
}
分享到:
相关推荐
(1) 完成5种常用内部排序算法的演示,5种排序算法为:快速排序,直接插入排序,选择排序,堆排序,希尔排序; (2) 待排序元素为整数,排序序列存储在数据文件中,要求排序元素不少于30个; (3) 演示程序开始,...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
6. 希尔排序:是对插入排序的一种改进,通过设置一个增量序列,使得元素能够跨过一定距离进行比较和交换,从而减少局部有序性的影响,提高排序速度。 7. 堆排序:利用了二叉堆的数据结构,可以看作是完全二叉树的...
### 直接插入排序与希尔排序的比较 #### 一、概述 本篇文章将通过一组具体的数据集(8个整数)对直接插入排序(Direct Insertion Sort)和希尔排序(Shell Sort)这两种排序方法进行深入分析和比较。这两种排序...
根据提供的文件信息,我们可以深入探讨几种经典的排序算法:冒泡排序、直接插入排序、快速排序以及希尔排序。这些算法在数据结构与算法课程中是非常重要的基础内容,它们各自有着独特的特性和应用场景。 ### 1. ...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
本实验涉及了六种常见的排序算法:泡泡排序、直接插入排序、折半插入排序、希尔排序、直接选择排序,并且对每种排序算法进行了性能分析,包括统计执行时间、比较次数和交换次数。这些数据被保存在TXT文件中,便于...
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
7. **希尔排序**:由Donald Shell提出的改进版本的插入排序,通过设置不同的增量将待排序的序列分割成若干子序列,分别进行直接插入排序,然后逐步减小增量,直至增量为1,完成整个序列的排序。希尔排序的时间复杂度...
各种基本排序方法(直接插入、希尔、直接选择、冒泡、快速、堆、二路归并)的大致原理和过程、复杂性和稳定性、相应算法的程序段;
//值为1,直接插入排序 case 2: BubbleSort(R); break; //值为2,冒泡法排序 case 3: QuickSort(R,1,n); break; //值为3,快速排序 case 4: SelectSort(R); break; //值为4,直接选择排序 case 5: HeapSort(R);...
本实验含有四部分内容——直接插入排序、希尔排序、选择排序、快速排序,在上述内容的基础上,将所有排序算法整合在一个程序中。学生可参考教材中的伪代码。鼓励学生自创新思路,新算法。
根据给定文件中的标题、描述、标签以及部分内容,我们可以总结出关于希尔排序(Shell Sort)、直接插入排序(Direct Insertion Sort)以及折半插入排序(Binary Insertion Sort)的相关知识点。 ### 希尔排序...
这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...
直接插入排序、希尔排序、冒泡排序、直接选择排序、堆排序、归并排序
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法