C++——算法基础之排序——希尔排序(已修改)

来源:互联网 发布:淘宝买家注册 编辑:程序博客网 时间:2024/05/17 09:45

这一节我们来聊一聊希尔排序!

希尔排序:按 dk 把序列分成若干子序列,先排子序列,再随着 dk 的减小合并排列。

教科书:希尔排序是插入排序的一种,其代码也难以理解;在要排序的序列中留下第 0 位用于临时储存元素。然后使 dk 按照某种方式逐渐减小直至为 1,完成排序。


(以下发现仅供参考)

本人:我更认为希尔排序是交换排序的一种,而且写出来的代码也易于理解,在要排序的序列中无需留下空间。

在循环次数上还有待提升。




#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <functional>#include <algorithm>#include <numeric>#include <stack>#include <queue>#include <vector>#include <string>#include <cstring>#include <conio.h>using namespace std;#define N 10//交换排序   希尔排序void shellSortFalse1 (int *a, int n, int &flag)//flag为交换次数{int mark = 0;for(int data = n / 2; data >= 1; data /= 2){bool completeSort = false;bool getTwoMax = false;for(int i = data; i < n && (!completeSort); i++){completeSort = true;for(int j = 0; j < (n - i); j++){mark++;getTwoMax = true;if(a[j] > a[j + data]){flag++;int temp = a[j];a[j] = a[j + data];a[j + data] = temp;completeSort = false;getTwoMax = false;}}if(getTwoMax){i++;}}cout << "shellSortFalse1:";for(int i = 0; i < n; i++){cout << "  " << a[i];}cout << endl << endl;}cout << "循环:" << mark << " 交换:" << flag << endl;}//交换排序   希尔排序void shellSortFalse2 (int *a, int n, int &flag)//flag为交换次数{int mark = 0;for(int data = n / 2; data >= 1; data /= 2){for(int i = data; i < n; i++){for(int j = 0; j < (n - i); j++){mark++;if(a[j] > a[j + data]){flag++;int temp = a[j];a[j] = a[j + data];a[j + data] = temp;}}}cout << "shellSortFalse2:";for(int i = 0; i < n; i++){cout << "  " << a[i];}cout << endl << endl;}cout << "循环:" << mark << " 交换:" << flag << endl;}//插入排序   希尔排序void shellSortTrue (int *p, int n, int &flag)//falg为插入次数{int mark = 0;int i, j;for(int dk = (n - 1) / 2; dk >= 1; dk /= 2){for(i = dk + 1; i < n; i++){if(p[i] < p[i - dk]){p[0] = p[i];for(j = i - dk; j > 0 && (p[0] < p[j]); j = j - dk){mark++;flag++;p[j + dk] = p[j];}p[j + dk] = p[0];}}cout << "shellSortTrue:";for(int i = 1; i < 21; i++){cout << "  " << p[i];}cout << endl << endl;}cout << "循环:" << mark << " 交换:" << flag << endl;}int main (){int a1[] = { 88, 6, 3, 8, 9, 8, 99, 11, 55, 66, 45, 69, 5, 2, 0, 7, 4, 1, 63, 23 };int flag1 = 0;shellSortFalse1 (a1, 20, flag1);cout << endl << endl;int a2[] = { -1, 88, 6, 3, 8, 9, 8, 99, 11, 55, 66, 45, 69, 5, 2, 0, 7, 4, 1, 63, 23 };int flag2 = 0;shellSortTrue (a2, 21, flag2);cout << endl << endl;return 0;}




0 0
原创粉丝点击