经典算法与数据结构的c++实现——shell排序算法

来源:互联网 发布:淘宝网消费者投诉电话 编辑:程序博客网 时间:2024/05/16 14:22

因为是经典的算法,所以网上描述一大把,直接上个图,直观些,给记性不好的菜鸟(如我)一点儿提示。


shell排序算法,是插入算法的一种改进,降低时间复杂度,不同选取gap的方式将改变算法的实现,我这里的采取的判断gap值,保持gap为奇数。
下面是代码(欢迎批评指点,之后应该会放到github上:https://github.com/y277an/princeton_algs4):

//---------------------------------Specification of Program------------------------------// Program Name:shell排序// Tools:VS_2013// Language: C++// Description: 可自由输入,不需要提早知道数据长度// Date:2016.3.17// Author:mseddl//----------------------------------------------------------------------------------------#include <iostream>using namespace std;void Swap(int& one, int & another){one ^= another;another ^= one;one ^= another;}void ShellSort(int *arr, int len){for (int delta = len / 2; delta>0; delta /= 2)//delta为shell的间隔{if (delta % 2 == 0)//为了提高效率,保证不重复排序,若delta为偶数,使其变成奇数{delta--;}for (int i = 0; i < delta; i++)//每个小分段的逐次循环{//以下实质为插入排序for (int j = i+delta; j < len; j += delta)//j为要排序的间隔数{for (int m = j-delta; m>=0; m -= delta)//m为有序的间隔数{int temp = arr[m];//有序间隔数的最后一个if (arr[m+delta]<arr[m]){Swap(arr[m + delta], arr[m]);}}}}}}int main(){int len(0), temp;int *arr = new int[100];char ch;cout << "请输入要排序的数字,以空格隔开:";while (1){cin >> temp;arr[len++] = temp;cin.get(ch);if (ch == '\n'){break;}}ShellSort(arr, len);cout << "排序后的数字为:";for (int i = 0; i < len; i++){cout << arr[i] << " ";}cout << endl;delete[] arr;}


0 0