C言語プログラミング2(挿入ソート)

| カテゴリ:C言語

ソート(sort)という単語をご存知でしょうか?
「整列」つまりばらばらの順番に並んだデータを並べ替えることを指します(コンピュータ系の世界だけかしら?)。
たとえば「351298746」というデータを「123456789」と変えることです。
このソートには様々なやり方(アルゴリズム)が考えられています。

今、ちょっとした機会がございまして、ソートのうちの定番と呼ばれるものを勉強しています。
せっかく勉強しているのでこちらにて紹介しようかと思いました。
役に立つかはわからないですが「もしかしたら知りたい人がいるかも」という理由でC言語にて書いたコードも掲載します。
知りたい人が0人だったらごめんなさい。

今回紹介するのは挿入ソートです。データが「35124」のときの数値の変化例を()内に書きます。

・まず1番目と2番目を順番に並べる。「35」
・3番目のデータをさきほどのデータの正しい位置に挿入する。「135」
・4番目のデータをさきほどのデータの正しい位置に挿入する。「1235」
・5番目のデータをさきほどのデータの正しい位置に挿入する。「12345」

つまりだんだんと範囲を広げながら、データを正しい位置に「挿入」していく手法です。
挿入についてはどう行うかというと、「1245」に「3」を挿入する場合を以下に書いてみます。

・まず、「1245」の最後尾である「5」と「3」を比べる。
・「3」は「5」より小さいので「5」の左に「3」を入れる。
 「12435」となる。
・続いて「3」を左の「4」と比べる。
・「3」は「4」より小さいので「4」の左に「3」を入れる。
 「12345」となる。
・続いて「3」を左の「2」と比べる。
・「3」は「2」より小さくないので、挿入完了となる。

では、以下にC言語で書いた挿入ソートのプログラムを掲載します。
ソートを行う関数部分のみです。


/* 挿入ソート関数ここから */
/* data[]:データ格納配列 num:配列要素数 */
void sort(int data[],int num){
int i,j,temp;
for(i=1;i<num;i++){
temp=data[i];
/*temp以下の値が出るまで配列を右にずらす*/
for(j=i; j>0 && temp<data[j-1] ; j--)data[j]=data[j-1];
data[j]=temp;
}
}
/* 挿入ソート関数ここまで */


挿入ソートは単純でわかりやすいですが、基本的に計算時間が多くかかります。
ただし、「整列済みのデータが本当に整列されているか」を確認したいときは高速です。
(最初から整列されているときには、データが先頭の次から順番に「自分より一つ前」を見るだけで済むため)

Wikipedia ソート
Wikipedia 挿入ソート
Wikipedia C言語

概要

青春B運営メンバー多口カタンによる雑記blogです。
自己紹介はこちら。開発物をまとめたものはこちら
 
ヘッダーイラストはkojiさん制作です。
感想・意見・要望等ありましたら気軽にフォームにてコンタクトくださいませ。
 
Twitterはじめましたので誰でも気軽に声かけてくださいね。