首页 > 代码库 > 2014年4月27日周总结(1)

2014年4月27日周总结(1)

【插入排序】

数组前k-1个元素已经有序,如何确定第k个元素的插入位置,使得这k个元素有序。

方法1:从左到右扫描扫描这个有序子数组,直到遇到第一个大于等于A[k]的元素,然后把A[k]插在这个元素的前面。

方法2:从右到左扫描这个有序子数组,直到遇到第一个小于等于A[k]的元素,然后把A[k]插在这个元素的后面。

【希尔排序】

先将数组分组,分别对每组进行插入排序,依次减少分组数进行插入排序,最后对分组数为1,即对整个数组进行插入排序。

【代码】

#include <stdio.h>
#include <stdlib.h>

void InsertionSort(int a[], int n)
{
	int i, j;
	int tmp;
	for(i = 1; i < n; i++)//方法2的插入方式
	{
		tmp = a[i];
		j = i - 1;
		while ( j >= 0 && a[j] > tmp)
		{
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = tmp;
	}
}

void ShellSort(int a[], int n)
{
	int step;
	int i, j, k;
	int tmp;
	for(step = n / 2; step > 0; step /= 2)  //不同步长的分组
		for(k = 0; k < step; k ++)  //总共分成step组
			for(i = k + step; i < n; i+=step) //对每组进行插入排序
			{
				tmp = a[i];
				j = i - step;
				while(j >= 0 && a[j] > tmp)
				{
					a[j + step] = a[j];
					j = j - step;
				}
				a[j + step] =tmp;
			}
}

int main(void)
{
	int a[7] = {5, 7, 3, 0, 4, 9, 8 };
	int n = sizeof(a)/sizeof(int);
	InsertionSort(a, n);
    ShellSort(a, n);
	for(int i = 0; i < n; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}


2014年4月27日周总结(1)