插入排序和希尔排序

来源:互联网 发布:手机淘宝店铺分享链接 编辑:程序博客网 时间:2024/06/05 00:44

插入排序

排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。

第一趟比较示图:


实现:

#include <iostream>#include <iomanip>using namespace std;//插入排序void InsertionSort(int a[], int n){int i, j;int temp;for (i = 1; i < n; i++){temp = a[i];for (j = i; j > 0 && a[j-1] > temp; j--){a[j] = a[j-1];}a[j] = temp;for (int k = 0; k < n; k++){cout << setw(4) << a[k] ;}cout << endl;}}int main(){int a[] = {15, 9, 8, 1, 4, 11, 7, 12, 13, 6, 5, 3, 16, 2, 10, 14};    int n = sizeof(a) / sizeof(int);    for (int k = 0; k < n; k++){     cout << setw(4) << a[k] ;}cout << endl;cout << "排序情况: " << endl;    InsertionSort(a,  n);cout << endl;return 0;}

希尔排序:

在上面这幅图中:

初始时,有一个大小为 10 的无序序列。

第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。

接下来,按照直接插入排序的方法对每个组进行排序。

第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。

按照直接插入排序的方法对每个组进行排序。

第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。

按照直接插入排序的方法对每个组进行排序。此时,排序已经结束

需要注意一下的是,图中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了

实现:

#include <iostream>#include <iomanip>using namespace std;//希尔排序void Shellsort(int a[], int n){int i, j, gap;int temp;for (gap = n / 2; gap > 0; gap = gap / 2)for (i = gap; i < n; i++){temp = a[i];for(j = i; j >= gap; j = j - gap){if (a[j-gap] > temp){a[j] = a[j-gap];}else break;}a[j] = temp; for (int k = 0; k < n; k++) {           cout << setw(4) << a[k] ; } cout << endl;}       }int main(){int a[] = {15, 9, 8, 1, 4, 11, 7, 12, 13, 6, 5, 3, 16, 2, 10, 14};    int n = sizeof(a) / sizeof(int);    for (int k = 0; k < n; k++){     cout << setw(4) << a[k] ;}cout << endl;cout << "排序情况: " << endl;    Shellsort(a,  n);cout << endl;return 0;}
运行结果:




原创粉丝点击