shell排序及两种优化
来源:互联网 发布:命中注定网络歌曲 编辑:程序博客网 时间:2024/06/14 00:01
原博客:白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇
//最佳步长:https://zh.wikipedia.org/wiki/希尔排序#include <iostream>#include <vector>using namespace std;void shellsort(vector<int> &vi){ if(vi.size()<=1) return ; int n=vi.size(); for(int step=n/2;step>0;step/=2){ for(int i=0;i<step;++i){//1 for(int j=i+step;j<n;j+=step){//2 //在当前层做插入排序,相当于直接插入排序的第一种优化。见直接插入排序。 if(vi[j]<vi[j-step]){//如果前一元素大于当前的元素 int temp=vi[j]; int k=j-step; while(k>=0 && vi[k]>temp){ vi[k+step]=vi[k]; k=k-step; } vi[k+step]=temp; } } } }}//优化1:结构上的优化,shellsort中1与2处的for可以合并一下。void shellsort1(vector<int> &vi){ if(vi.size()<=1) return ; int n=vi.size(); for(int step=n/2;step>0;step/=2){ for(int j=step;j<n;++j){ if(vi[j]<vi[j-step]){ int temp=vi[j]; int k=j-step; while(k>=0 && vi[k]>temp){ vi[k+step]=vi[k]; k=k-step; } vi[k+step]=temp; } } }}//优化2:结构上的优化,用swap来使代码更精简,但是效率会变低一点void shellsort2(vector<int> &vi){ if(vi.size()<=1) return ; int n=vi.size(); for(int step=n/2;step>0;step/=2) for(int j=step;j<n;++j) for(int k=j-step;k>=0 && vi[k]>vi[k+step];k-=step) swap(vi[k],vi[k+step]);}int main(){ vector<int> vi; vi={1,8,2,3,7,6,9,5,4};// shellsort(vi);// shellsort1(vi); shellsort2(vi); for(auto ieh: vi) cout<<ieh<<" "; cout<<endl; return 0;}
阅读全文
0 0
- shell排序及两种优化
- 冒泡排序及两种优化方式
- 快速排序的三种实现及两种优化
- 快速排序两种方式实现及优化总结
- 冒泡排序算法的两种优化
- 冒泡排序算法及其两种优化
- java两种排序及二分查找
- 简单冒泡排序的时间复杂度及其两种优化
- 简单冒泡排序的写法和两种优化
- 几种常见排序及优化版本
- 冒泡排序及2种优化方法
- 插入排序及2种优化
- Java排序算法优化--Shell排序【温故而知新】
- 快速排序及优化
- 快速排序及优化
- 计数排序及优化
- 快速排序及优化
- 插入排序及优化
- 期权:Black-Scholes put and call option pricing
- selenium新建标签页面
- Java_基础—异常的概述和分类/JVM默认处理异常的方式
- es6 语法解析
- 集合总结
- shell排序及两种优化
- 深入分析C语言中结构体指针的定义与引用详解
- .mpp的一种查看方法
- 通过jq选择器dom操作获得焦点
- php+jquery+ajax滚动条滚动到底部自动加载,简单实现瀑布流
- Cocoapods搜不到库的问题
- 小希的迷宫 HDU
- Kotlin入门(8)空值的判断与处理
- Jquery多选、反选、批量