【插入排序】
数组前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; }
时间: 2024-10-08 11:13:25