C++サンプル集

【第1部】C言語(K&R検証)編

0019.シェルソートを実装する

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
using namespace std;

/*
v[0] ... v[ n-1 ]を昇順にソート
*/
void shellsort(int v[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            for (int j = i - gap; j >= 0 && v[j] > v[j + gap]; j -= gap) {
                int temp = v[j];
                v[j] = v[j + gap];
                v[j + gap] = temp;
            }
        }
    }
}


/*
シェルソートの検証
*/
int main()
{
    srand((unsigned int)time(NULL));
    int arr[100];
    cout <<  "ソート前" << endl;
    for (auto& v : arr) {
        v = rand() % 100;
        cout << v << ",";
    }
    cout << endl;
    shellsort(arr,100);
    cout << "ソート後" << endl;
    for (auto v : arr) {
        cout << v << ",";
    }
    cout << endl;
    return 0;
}
出力
ソート前
54,4,60,13,67,78,24,66,76,28,53,91,59,34,69,7,9,32,8,61,
73,15,58,82,31,81,54,29,36,53,96,82,1,67,16,47,70,52,96,
60,36,94,30,49,0,31,23,17,98,43,59,69,62,58,23,62,26,2,
94,71,56,85,59,58,17,75,31,85,82,35,34,76,50,26,92,1,93,
0,12,35,24,45,33,59,80,55,4,3,71,26,57,36,20,76,44,7,91,79,38,67,
ソート後
0,0,1,1,2,3,4,4,7,7,8,9,12,13,15,16,17,17,20,23,23,24,24,
26,26,26,28,29,30,31,31,31,32,33,34,34,35,35,36,36,36,38,
43,44,45,47,49,50,52,53,53,54,54,55,56,57,58,58,58,59,59,
59,59,60,60,61,62,62,66,67,67,67,69,69,70,71,71,73,75,76,
76,76,78,79,80,81,82,82,82,85,85,91,91,92,93,94,94,96,96,98,

 ※数字間はブラウザの関係で改行が入ってますが、出力には改行は入りません。

サンプル説明

 シェルソートは、ドナルド・シェルという人が考えたソート法で挿入ソートの一種だそうです。離れた要素同士のソートをまず行い、そのあと近くの要素同士をソートする、という手法です。

K&Rでの記述

 元になったのは第3章:制御の流れに記述されています。ループの説明のところです。