ForNext
Only Do What Only You Can Do
100. ポインタのソート
VBScript
JScript
Perl
更新日 : 2010.10.18
$NINSU = 5; sub swap { my ($x, $y) = @_; $tmp = $$x; $$x = $$y; $$y = $tmp; } sub compare_height { my ($x, $y) = @_; return 1 if ($$x->{"height"} > $$y->{"height"}); return -1 if ($$x->{"height"} < $$y->{"height"}); return 0; } sub compare_weight { my ($x, $y) = @_; return 1 if ($$x->{"weight"} > $$y->{"weight"}); return -1 if ($$x->{"weight"} < $$y->{"weight"}); return 0; } sub sort { my ($data, $ptr, $n, $compare) = @_; $k = $$n - 1; while ($k >= 0) { $j = -1; foreach $i(1..$k) { if ($compare->(\$$data[$ptr[$i - 1]], \$$data[$ptr[$i]]) > 0) { $j = $i - 1; &swap(\$$ptr[$i], \$$ptr[$j]); } } $k = $j; } } @data = (); push(@data, {name => "Sato", height => 178, weight => 61.0}); push(@data, {name => "Sanaka", height => 175, weight => 60.5}); push(@data, {name => "Takao", height => 173, weight => 80.0}); push(@data, {name => "Mike", height => 165, weight => 72.0}); push(@data, {name => "Masaki", height => 179, weight => 77.5}); @ptr = (0..4); print "ソ\ート前:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$ptr[$_]]{"name"}, $data[$ptr[$_]]{"height"}, $data[$ptr[$_]]{"weight"}); } print "\n"; &sort(\@data, \@ptr, \$NINSU, \&compare_height); print "身長でソ\ート後:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$ptr[$_]]{"name"}, $data[$ptr[$_]]{"height"}, $data[$ptr[$_]]{"weight"}); } print "\n"; &sort(\@data, \@ptr, \$NINSU, \&compare_weight); print "体重でソ\ート後:\n"; for (0..$NINSU-1) { printf("%2d:%-8s%4d%6.1f\n", $_ + 1, $data[$ptr[$_]]{"name"}, $data[$ptr[$_]]{"height"}, $data[$ptr[$_]]{"weight"}); } print "\n"; print "元の配列:\n"; $i = 1; map { printf("%2d:%-8s%4d%6.1f\n", $i, $_->{"name"}, $_->{"height"}, $_->{"weight"}); $i++; } @data;
L:\>perl lesson_12_100.pl ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0 元の配列: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5
PHP
更新日 : 2010.11.03
<?php $NINSU = 5; function swap(&$x, &$y) { $tmp = $x; $x = $y; $y = $tmp; } function compare_height($x, $y) { if ($x["height"] > $y["height"]) return 1; if ($x["height"] < $y["height"]) return -1; return 0; } function compare_weight($x, $y) { if ($x["weight"] > $y["weight"]) return 1; if ($x["weight"] < $y["weight"]) return -1; return 0; } function sort1(&$data, &$ptr, $n, $compare) { $k = $n - 1; while ($k >= 0) { $j = -1; for ($i = 1; $i <= $k; $i++) { if ($compare($data[$ptr[$i - 1]], $data[$ptr[$i]]) > 0) { $j = $i - 1; swap($ptr[$i], $ptr[$j]); } } $k = $j; } } $data = array(); $data[] = array(name => "Sato", height => 178, weight => 61.0); $data[] = array(name => "Sanaka", height => 175, weight => 60.5); $data[] = array(name => "Takao", height => 173, weight => 80.0); $data[] = array(name => "Mike", height => 165, weight => 72.0); $data[] = array(name => "Masaki", height => 179, weight => 77.5); $ptr = array(0, 1, 2, 3, 4); print "ソート前:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$i]["name"], $data[$i]["height"], $data[$i]["weight"]); } print "\n"; sort1($data, $ptr, $NINSU, "compare_height"); print "身長でソート後:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$ptr[$i]]["name"], $data[$ptr[$i]]["height"], $data[$ptr[$i]]["weight"]); } print "\n"; sort1($data, $ptr, $NINSU, "compare_weight"); print "体重でソート後:\n"; for ($i = 0; $i < $NINSU; $i++) { printf("%2d:%-8s%4d%6.1f\n", $i + 1, $data[$ptr[$i]]["name"], $data[$ptr[$i]]["height"], $data[$ptr[$i]]["weight"]); } print "\n"; print "元の配列:\n"; $i = 1; function puts($data) { global $i; printf("%2d:%-8s%4d%6.1f\n", $i, $data["name"], $data["height"], $data["weight"]); $i++; } array_walk($data, "puts"); ?>
L:\>php lesson_12_100.php ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0 元の配列: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5
Python
更新日 : 2010.11.17
# coding: Shift_JIS NINSU = 5 def compare_height(x, y): if (x["height"] > y["height"]): return 1 if (x["height"] < y["height"]): return -1 return 0 def compare_weight(x, y): if (x["weight"] > y["weight"]): return 1 if (x["weight"] < y["weight"]): return -1 return 0 def sort(data, ptr, n, compare): k = n - 1 while (k >= 0): j = -1; for i in range(1, k + 1, 1): if (compare(data[ptr[i - 1]], data[ptr[i]]) > 0): j = i - 1 ptr[i], ptr[j] = ptr[j], ptr[i] k = j data = [] data.append({"name":"Sato", "height":178, "weight":61.0}) data.append({"name":"Sanaka", "height":175, "weight":60.5}) data.append({"name":"Takao", "height":173, "weight":80.0}) data.append({"name":"Mike", "height":165, "weight":72.0}) data.append({"name":"Masaki", "height":179, "weight":77.5}) ptr = [0, 1, 2, 3, 4]; print "ソート前:" i = 1 for d in data: print "%2d:%-8s%4d%6.1f" % (i, d["name"], d["height"], d["weight"]) i += 1 print sort(data, ptr, NINSU, compare_height) print "身長でソート後:" for i in range(0, NINSU, 1): print "%2d:%-8s%4d%6.1f" % (i + 1, data[ptr [i]]["name"], data[ptr [i]]["height"], data[ptr [i]]["weight"]) print sort(data, ptr, NINSU, compare_weight) print "体重でソート後:" for i in range(0, NINSU, 1): print "%2d:%-8s%4d%6.1f" % (i + 1, data[ptr [i]]["name"], data[ptr [i]]["height"], data[ptr [i]]["weight"]) print print "元の配列:" i = 1 def puts(data): global i print "%2d:%-8s%4d%6.1f" % (i, data["name"], data["height"], data["weight"]) i += 1 map((lambda d: puts(d)), data)
N:\>python lesson_12_100.py ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0 元の配列: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5
Ruby
更新日 : 2010.11.01
NINSU = 5 def compare_height(x, y) return 1 if (x["height"] > y["height"]) return -1 if (x["height"] < y["height"]) return 0 end def compare_weight(x, y) return 1 if (x["weight"] > y["weight"]) return -1 if (x["weight"] < y["weight"]) return 0 end def sort(data, ptr, n, compare) k = n - 1 while (k >= 0) j = -1 for i in 1..k if (compare.call(data[ptr[i-1]], data[ptr[i]]) > 0) j = i - 1 ptr[i], ptr[j] = ptr[j], ptr[i] end end k = j end end data = [] data.push({"name" => "Sato", "height" => 178, "weight" => 61.0}) data.push({"name" => "Sanaka", "height" => 175, "weight" => 60.5}) data.push({"name" => "Takao", "height" => 173, "weight" => 80.0}) data.push({"name" => "Mike", "height" => 165, "weight" => 72.0}) data.push({"name" => "Masaki", "height" => 179, "weight" => 77.5}) ptr = [0, 1, 2, 3, 4] puts "ソ\ート前:" data.each_with_index do |d, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, d["name"], d["height"], d["weight"]) end puts "" sort(data, ptr, NINSU, method(:compare_height)) puts "身長でソ\ート後:" ptr.each_with_index do |p, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, data[p]["name"], data[p]["height"], data[p]["weight"]) end puts "" sort(data, ptr, NINSU, method(:compare_weight)) puts "体重でソ\ート後:" ptr.each_with_index do |p, i| printf("%2d:%-8s%4d%6.1f\n", i + 1, data[p]["name"], data[p]["height"], data[p]["weight"]) end puts "" puts "元の配列:" i = 1 data.map { |d| printf("%2d:%-8s%4d%6.1f\n", i, d["name"], d["height"], d["weight"]); i += 1 }
L:\>ruby l:\lesson_12_100.rb ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0 元の配列: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5
PowerShell
Scala
F#
C
更新日 : 2010.10.08
#include <stdio.h> #include <string.h> #include <alloc.h> #define NINSU 5 typedef struct { char name[20]; int height; float weight; } gstudent; typedef int (*compare)(gstudent*, gstudent*); int compare_height(gstudent* x, gstudent* y) { if (x->height > y->height) return 1; if (x->height < y->height) return -1; return 0; } int compare_weight(gstudent* x, gstudent* y) { if (x->weight > y->weight) return 1; if (x->weight < y->weight) return -1; return 0; } void swap(gstudent** x, gstudent** y) { gstudent* tmp = *x; *x = *y; *y = tmp; } void sort(gstudent* data, gstudent** ptr, int n, compare comp) { int k = n - 1; while (k >= 0) { int i, j; for (i = 1, j = -1; i <= k; i++) { if (comp(ptr[i - 1], ptr[i]) > 0) { j = i - 1; swap(&ptr[i], &ptr[j]); } } k = j; } } void set_student(gstudent* std, char name[], int height, float weight) { strcpy(std->name, name); std->height = height; std->weight = weight; } int main(int argc, char* argv[]) { int i; gstudent* data; data = (gstudent*)malloc(sizeof(gstudent) * 5); gstudent** ptr; ptr = (gstudent**)malloc(sizeof(gstudent*) * 5); set_student(&data[0], "Sato", 178, 61.0); set_student(&data[1], "Sanaka", 175, 60.5); set_student(&data[2], "Takao", 173, 80.0); set_student(&data[3], "Mike", 165, 72.0); set_student(&data[4], "Masaki", 179, 77.5); for (i = 0; i < NINSU; i++) ptr[i] = &data[i]; puts("ソート前:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); puts(""); /* 身長でソート */ sort(data, ptr, NINSU, &compare_height); puts("身長でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); puts(""); /* 体重でソート */ sort(data, ptr, NINSU, &compare_weight); puts("体重でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); free(data); free(ptr); return 0; }
R:\>lesson100\project1.exe ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
C++
更新日 : 2010.10.13
#include <stdio.h> #include <string.h> #include <alloc.h> const int NINSU = 5; struct gstudent { char name[20]; int height; float weight; }; typedef int (*compare)(gstudent*, gstudent*); int compare_height(gstudent* x, gstudent* y) { if (x->height > y->height) return 1; if (x->height < y->height) return -1; return 0; } int compare_weight(gstudent* x, gstudent* y) { if (x->weight > y->weight) return 1; if (x->weight < y->weight) return -1; return 0; } void swap(gstudent** x, gstudent** y) { gstudent* tmp = *x; *x = *y; *y = tmp; } void sort(gstudent* data, gstudent** ptr, int n, compare comp) { int k = n - 1; while (k >= 0) { int i, j; for (i = 1, j = -1; i <= k; i++) { if (comp(ptr[i - 1], ptr[i]) > 0) { j = i - 1; swap(&ptr[i], &ptr[j]); } } k = j; } } void set_student(gstudent* std, char name[], int height, float weight) { strcpy(std->name, name); std->height = height; std->weight = weight; } int main(int argc, char* argv[]) { int i; gstudent* data = new gstudent[5]; gstudent** ptr = new gstudent*[5]; set_student(&data[0], "Sato", 178, 61.0); set_student(&data[1], "Sanaka", 175, 60.5); set_student(&data[2], "Takao", 173, 80.0); set_student(&data[3], "Mike", 165, 72.0); set_student(&data[4], "Masaki", 179, 77.5); for (i = 0; i < NINSU; i++) ptr[i] = &data[i]; puts("ソート前:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); puts(""); // 身長でソート sort(data, ptr, NINSU, &compare_height); puts("身長でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); puts(""); // 体重でソート sort(data, ptr, NINSU, &compare_weight); puts("体重でソート後:"); for (i = 0; i < NINSU; i++) printf("%2d:%-8s%4d%6.1f\n", i + 1, ptr[i]->name, ptr[i]->height, ptr[i]->weight); delete[] data; delete[] ptr; return 0; }
T:\>lesson100\project1.exe ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0
C++Builder
VC++
C#
Java
Objective-C
D
VB
VB.NET
Delphi
更新日 : 2010.09.24
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const NINSU = 5; type TStudent = record name: array[0..19] of Char; height: Integer; weight: Real; end; PStudent = ^TStudent; TCharArray = array[0..19] of Char; TCompare = function (x:TStudent; y:TStudent):Integer; function compare_height(x:TStudent; y:TStudent):Integer; begin if (x.height > y.height) then result := 1 else if (x.height < y.height) then result := -1 else result := 0; end; function compare_weight(x:TStudent; y:TStudent):Integer; begin if (x.weight > y.weight) then result := 1 else if (x.weight < y.weight) then result := -1 else result := 0; end; procedure swap(var x:PStudent; var y:PStudent); var tmp: PStudent; begin tmp:= x; x := y; y := tmp; end; procedure sort(var ptr:array of PStudent; n:Integer; Comp:TCompare); var i, j, k: Integer; begin k := 4; while (k >= 0) do begin j := -1; for i := 1 to k do begin if (Comp(ptr[i - 1]^, ptr[i]^) > 0) then begin j := i - 1; swap(ptr[i], ptr[j]); end; end; k := j; end; end; procedure set_student(var data:TStudent; name:String; height:Integer; weight:Real); begin StrCopy(data.name, PChar(name)); data.height := height; data.weight := weight; end; procedure main(); var i:Integer; data: array of TStudent; ptr: array of PStudent; begin GetMem(data, SizeOf(TStudent) * 3); GetMem(ptr, SizeOf(PStudent) * 3); set_student(data[0], 'Sato', 178, 61.0); set_student(data[1], 'Sanaka', 175, 60.5); set_student(data[2], 'Takao', 173, 80.0); ReallocMem(data, SizeOf(TStudent) * 5); ReallocMem(ptr, SizeOf(PStudent) * 5); set_student(data[3], 'Mike', 165, 72.0); set_student(data[4], 'Masaki', 179, 77.5); for i := 0 to 4 do ptr[i] := @data[i]; Writeln('ソート前:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, data[i].name, data[i].height, data[i].weight])); Writeln(''); (* 身長でソート *) sort(ptr, NINSU, compare_height); Writeln('身長でソート後:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, ptr[i]^.name, ptr[i]^.height, ptr[i]^.weight])); Writeln(''); (* 体重でソート *) sort(ptr, NINSU, compare_weight); Writeln('体重でソート後:'); for i := 0 to 4 do Writeln(Format('%2d:%-8s%4d%6.1f', [i + 1, ptr[i]^.name, ptr[i]^.height, ptr[i]^.weight])); FreeMem(data); FreeMem(ptr); end; begin main; end.
S:\>lesson100\project1.exe ソート前: 1:Sato 178 61.0 2:Sanaka 175 60.5 3:Takao 173 80.0 4:Mike 165 72.0 5:Masaki 179 77.5 身長でソート後: 1:Mike 165 72.0 2:Takao 173 80.0 3:Sanaka 175 60.5 4:Sato 178 61.0 5:Masaki 179 77.5 体重でソート後: 1:Sanaka 175 60.5 2:Sato 178 61.0 3:Mike 165 72.0 4:Masaki 179 77.5 5:Takao 173 80.0