1.直接插入类排序
1. What:
- 从无序区的元素中,选择一个元素,把它插入到有序区 的适当位置中
2.How:
/*直接插入排序*/
static void insertSort (int a[], int n)
{
int i = 0;
int j = 0;
int temp = 0;
for (i=1; i < n; ++i) //第一个元素已经在有序区,n 个数需要 n-1 次的插入
{
if (a[i-1] > a[i]) //有序区中的元素大于无序区中的元素
{
temp = a[i]; //保存无序区中的第一个元素
j = i-1; //有序区中的最后一个元素
while (j >= 0) /* 插入的数字小于有序区的元素,需要移动元素 */
{
a[j+1] = a[j];
--j;
}
a[j+1] = temp;
}
}
return;
}
2. 折半插入排序
1. What:
- 对有序区中的元素进行折半查找,找到要插入元素的位置下标。
- 当有序区中的元素大于被插入的元素时需要移动有序区中的元素。
2.How:
static void halfInsertSort(int a[], int n)
{
int i = 0;
int j = 0;
int temp = 0;
int low = 0;
int high = 0;
int mid = 0;
for (i = 1; i < n; i++)
{
temp = a[i]; /* 保存无序区中的第一个元素 */
//有序区中进行折半查找
low = 0;
high = i-1;
while (low <= high)
{
mid = (low >> 1) + (high >> 1);
if (temp < a[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
/* high < low */
for (j = i-1; j>high; --j)
{
a[j+1] = a[j];
}
a[high+1] = temp;
}
}
3. 希尔排序
1. What:
- 缩小增量排序。
- 每一趟把待排序的元素分为 n/d 组,每组有 d 个元素。
2.How:
/*希尔排序*/
static void shellSort (int a[], int n)
{
int i = 0;
int j = 0;
int temp = 0;
int d = n >> 1;
while (d)
{
for (i=d; i < n; ++i)
{
if (a[i-d] > a[i]) //有序区 大于 无序区
{
temp = a[i]; //保存要插入的临时变量
j=i-d;
while ( j >= 0 ) /* 有序区中的元素 > 要插入的元素,需要移动元素 */
{
a[j+d] = a[j];
j = j-d;
}
a[j+d] = temp;
}
}
d = d >> 1;
}
return;
}