# select sort

could any one help me with the select sort for an array using pointers
thanks...

• : could any one help me with the select sort for an array using pointers
: thanks...
:
Here is the selection sort code. You'll have to provide the compare function.
[code]
type
TCompare = function(Item1, Item2: pointer): integer;
TPointerArray = array[0..16000] of pointer;

procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
var
i, j, min: integer;
temp: pointer;
begin
for i := 0 to High(PointerArray)-1 do
begin
min := i;
for j := i+1 to High(PointerArray) do
if Compare(PointerArray[j], PointerArray[min]) < 0 then
min = j;
temp := PointerArray[i];
PointerArray[i] := PointerArray[min];
PointerArray[min] := temp;
end;
[/code]
• : : could any one help me with the select sort for an array using pointers
: : thanks...
: :
: Here is the selection sort code. You'll have to provide the compare function.
: [code]
: type
: TCompare = function(Item1, Item2: pointer): integer;
: TPointerArray = array[0..16000] of pointer;
:
: procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: var
: i, j, min: integer;
: temp: pointer;
: begin
: for i := 0 to High(PointerArray)-1 do
: begin
: min := i;
: for j := i+1 to High(PointerArray) do
: if Compare(PointerArray[j], PointerArray[min]) < 0 then
: min = j;
: temp := PointerArray[i];
: PointerArray[i] := PointerArray[min];
: PointerArray[min] := temp;
: end;
: [/code]
:

I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
thanks alot

• : : : could any one help me with the select sort for an array using pointers
: : : thanks...
: : :
: : Here is the selection sort code. You'll have to provide the compare function.
: : [code]
: : type
: : TCompare = function(Item1, Item2: pointer): integer;
: : TPointerArray = array[0..16000] of pointer;
: :
: : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : var
: : i, j, min: integer;
: : temp: pointer;
: : begin
: : for i := 0 to High(PointerArray)-1 do
: : begin
: : min := i;
: : for j := i+1 to High(PointerArray) do
: : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : min = j;
: : temp := PointerArray[i];
: : PointerArray[i] := PointerArray[min];
: : PointerArray[min] := temp;
: : end;
: : [/code]
: :
:
: I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: thanks alot
:
:
High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
• : : : : could any one help me with the select sort for an array using pointers
: : : : thanks...
: : : :
: : : Here is the selection sort code. You'll have to provide the compare function.
: : : [code]
: : : type
: : : TCompare = function(Item1, Item2: pointer): integer;
: : : TPointerArray = array[0..16000] of pointer;
: : :
: : : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : : var
: : : i, j, min: integer;
: : : temp: pointer;
: : : begin
: : : for i := 0 to High(PointerArray)-1 do
: : : begin
: : : min := i;
: : : for j := i+1 to High(PointerArray) do
: : : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : : min = j;
: : : temp := PointerArray[i];
: : : PointerArray[i] := PointerArray[min];
: : : PointerArray[min] := temp;
: : : end;
: : : [/code]
: : :
: :
: : I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: : thanks alot
: :
: :
: High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
:

how can I input the array ... ( can not read or input variables of this type)...

I've made a program that allows me to input numbers using pointers then I added a select sort but it didn't workout can you help me please to check the error... here is the program :

uses wincrt;
type pelem = ^elem;
elem = record
key : integer;
next : pelem;
end;

var pstart,p,prev: pelem;
e : elem;
i,n:integer;

begin
write('n= ');
writeln('Input the numbers : ');
new(pstart);
pstart^:= e ;
e.next:= nil;
{****************************** INPUT ********************************}
for i:=1 to n do
begin
new(p);
p:= pstart;
while (p^.next <> nil) do
p:= p^.next;
new(P^.next);
p^.next^:= e;
e.next:= nil;
end;
{******************************* select sort **************************}

p:= pstart;

if (p^.next <> nil) and (p^.key > p^.next^.key) then
begin
p^.next:= p^.next^.next;
new(p^.next^.next); {I think the mistake is here}
p^.next^.next:=p;
end;

{****************************** OUTPUT *******************************}
writeln;
writeln;
writeln('************************');
p:= pstart;

while p <> nil do
begin
write(P^.key:2);
p:= p^.next;
end;
end.

I'm just a beginer in turbo pascal so thank you for the help
• : : : : : could any one help me with the select sort for an array using pointers
: : : : : thanks...
: : : : :
: : : : Here is the selection sort code. You'll have to provide the compare function.
: : : : [code]
: : : : type
: : : : TCompare = function(Item1, Item2: pointer): integer;
: : : : TPointerArray = array[0..16000] of pointer;
: : : :
: : : : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : : : var
: : : : i, j, min: integer;
: : : : temp: pointer;
: : : : begin
: : : : for i := 0 to High(PointerArray)-1 do
: : : : begin
: : : : min := i;
: : : : for j := i+1 to High(PointerArray) do
: : : : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : : : min = j;
: : : : temp := PointerArray[i];
: : : : PointerArray[i] := PointerArray[min];
: : : : PointerArray[min] := temp;
: : : : end;
: : : : [/code]
: : : :
: : :
: : : I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: : : thanks alot
: : :
: : :
: : High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
: :
:
:
: how can I input the array ... ( can not read or input variables of this type)...
:
: I've made a program that allows me to input numbers using pointers then I added a select sort but it didn't workout can you help me please to check the error... here is the program :
:
:
: uses wincrt;
: type pelem = ^elem;
: elem = record
: key : integer;
: next : pelem;
: end;
:
: var pstart,p,prev: pelem;
: e : elem;
: i,n:integer;
:
: begin
: write('n= ');
: writeln('Input the numbers : ');
: new(pstart);
: pstart^:= e ;
: e.next:= nil;
: {****************************** INPUT ********************************}
: for i:=1 to n do
: begin
: new(p);
: p:= pstart;
: while (p^.next <> nil) do
: p:= p^.next;
: new(P^.next);
: p^.next^:= e;
: e.next:= nil;
: end;
: {******************************* select sort **************************}
:
: p:= pstart;
:
: if (p^.next <> nil) and (p^.key > p^.next^.key) then
: begin
: p^.next:= p^.next^.next;
: new(p^.next^.next); {I think the mistake is here}
: p^.next^.next:=p;
: end;
:
:
: {****************************** OUTPUT *******************************}
: writeln;
: writeln;
: writeln('************************');
: p:= pstart;
:
: while p <> nil do
: begin
: write(P^.key:2);
: p:= p^.next;
: end;
: end.
:
: I'm just a beginer in turbo pascal so thank you for the help
:
The code you posted her isn't an array structure, but a linked list.
As for filling the pointerarray, that greatly depends on the type of the array elements. For example: a pointer array of integers would look something like this:
[code]
GetMem(A[0], SizeOf(Integer));
A[0]^ := 5;
[/code]
while an pointer array of objects would be filled like this:
[code]
var
P: PMyObject;

New(P, Init);
A[1] := P;
[/code]

• : : : : : : could any one help me with the select sort for an array using pointers
: : : : : : thanks...
: : : : : :
: : : : : Here is the selection sort code. You'll have to provide the compare function.
: : : : : [code]
: : : : : type
: : : : : TCompare = function(Item1, Item2: pointer): integer;
: : : : : TPointerArray = array[0..16000] of pointer;
: : : : :
: : : : : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : : : : var
: : : : : i, j, min: integer;
: : : : : temp: pointer;
: : : : : begin
: : : : : for i := 0 to High(PointerArray)-1 do
: : : : : begin
: : : : : min := i;
: : : : : for j := i+1 to High(PointerArray) do
: : : : : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : : : : min = j;
: : : : : temp := PointerArray[i];
: : : : : PointerArray[i] := PointerArray[min];
: : : : : PointerArray[min] := temp;
: : : : : end;
: : : : : [/code]
: : : : :
: : : :
: : : : I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: : : : thanks alot
: : : :
: : : :
: : : High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
: : :
: :
: :
: : how can I input the array ... ( can not read or input variables of this type)...
: :
: : I've made a program that allows me to input numbers using pointers then I added a select sort but it didn't workout can you help me please to check the error... here is the program :
: :
: :
: : uses wincrt;
: : type pelem = ^elem;
: : elem = record
: : key : integer;
: : next : pelem;
: : end;
: :
: : var pstart,p,prev: pelem;
: : e : elem;
: : i,n:integer;
: :
: : begin
: : write('n= ');
: : writeln('Input the numbers : ');
: : new(pstart);
: : pstart^:= e ;
: : e.next:= nil;
: : {****************************** INPUT ********************************}
: : for i:=1 to n do
: : begin
: : new(p);
: : p:= pstart;
: : while (p^.next <> nil) do
: : p:= p^.next;
: : new(P^.next);
: : p^.next^:= e;
: : e.next:= nil;
: : end;
: : {******************************* select sort **************************}
: :
: : p:= pstart;
: :
: : if (p^.next <> nil) and (p^.key > p^.next^.key) then
: : begin
: : p^.next:= p^.next^.next;
: : new(p^.next^.next); {I think the mistake is here}
: : p^.next^.next:=p;
: : end;
: :
: :
: : {****************************** OUTPUT *******************************}
: : writeln;
: : writeln;
: : writeln('************************');
: : p:= pstart;
: :
: : while p <> nil do
: : begin
: : write(P^.key:2);
: : p:= p^.next;
: : end;
: : end.
: :
: : I'm just a beginer in turbo pascal so thank you for the help
: :
: The code you posted her isn't an array structure, but a linked list.
: As for filling the pointerarray, that greatly depends on the type of the array elements. For example: a pointer array of integers would look something like this:
: [code]
: GetMem(A[0], SizeOf(Integer));
: A[0]^ := 5;
: [/code]
: while an pointer array of objects would be filled like this:
: [code]
: var
: P: PMyObject;
:
: New(P, Init);
: A[1] := P;
: [/code]
:
: in my code... I tryed the input and the output without sorting the numbers... and it worked very
well.. but when I tryed to sort them using the select sort ... it didn't work ...
my idea for the sorting as you can see ... is to compare the key of an element with
the next one and replacing the pointers if it was bigger..

• : : : : : : : could any one help me with the select sort for an array using pointers
: : : : : : : thanks...
: : : : : : :
: : : : : : Here is the selection sort code. You'll have to provide the compare function.
: : : : : : [code]
: : : : : : type
: : : : : : TCompare = function(Item1, Item2: pointer): integer;
: : : : : : TPointerArray = array[0..16000] of pointer;
: : : : : :
: : : : : : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : : : : : var
: : : : : : i, j, min: integer;
: : : : : : temp: pointer;
: : : : : : begin
: : : : : : for i := 0 to High(PointerArray)-1 do
: : : : : : begin
: : : : : : min := i;
: : : : : : for j := i+1 to High(PointerArray) do
: : : : : : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : : : : : min = j;
: : : : : : temp := PointerArray[i];
: : : : : : PointerArray[i] := PointerArray[min];
: : : : : : PointerArray[min] := temp;
: : : : : : end;
: : : : : : [/code]
: : : : : :
: : : : :
: : : : : I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: : : : : thanks alot
: : : : :
: : : : :
: : : : High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
: : : :
: : :
: : :
: : : how can I input the array ... ( can not read or input variables of this type)...
: : :
: : : I've made a program that allows me to input numbers using pointers then I added a select sort but it didn't workout can you help me please to check the error... here is the program :
: : :
: : :
: : : uses wincrt;
: : : type pelem = ^elem;
: : : elem = record
: : : key : integer;
: : : next : pelem;
: : : end;
: : :
: : : var pstart,p,prev: pelem;
: : : e : elem;
: : : i,n:integer;
: : :
: : : begin
: : : write('n= ');
: : : writeln('Input the numbers : ');
: : : new(pstart);
: : : pstart^:= e ;
: : : e.next:= nil;
: : : {****************************** INPUT ********************************}
: : : for i:=1 to n do
: : : begin
: : : new(p);
: : : p:= pstart;
: : : while (p^.next <> nil) do
: : : p:= p^.next;
: : : new(P^.next);
: : : p^.next^:= e;
: : : e.next:= nil;
: : : end;
: : : {******************************* select sort **************************}
: : :
: : : p:= pstart;
: : :
: : : if (p^.next <> nil) and (p^.key > p^.next^.key) then
: : : begin
: : : p^.next:= p^.next^.next;
: : : new(p^.next^.next); {I think the mistake is here}
: : : p^.next^.next:=p;
: : : end;
: : :
: : :
: : : {****************************** OUTPUT *******************************}
: : : writeln;
: : : writeln;
: : : writeln('************************');
: : : p:= pstart;
: : :
: : : while p <> nil do
: : : begin
: : : write(P^.key:2);
: : : p:= p^.next;
: : : end;
: : : end.
: : :
: : : I'm just a beginer in turbo pascal so thank you for the help
: : :
: : The code you posted her isn't an array structure, but a linked list.
: : As for filling the pointerarray, that greatly depends on the type of the array elements. For example: a pointer array of integers would look something like this:
: : [code]
: : GetMem(A[0], SizeOf(Integer));
: : A[0]^ := 5;
: : [/code]
: : while an pointer array of objects would be filled like this:
: : [code]
: : var
: : P: PMyObject;
: :
: : New(P, Init);
: : A[1] := P;
: : [/code]
: :
: : in my code... I tryed the input and the output without sorting the numbers... and it worked very
: well.. but when I tryed to sort them using the select sort ... it didn't work ...
: my idea for the sorting as you can see ... is to compare the key of an element with
: the next one and replacing the pointers if it was bigger..
:
:
Then you wouldn't implement the selection sort, but the bubble sort. Since I don't know your code for the Compare() function or which error you get I cannot help you debug it.
• : : : : : : : : could any one help me with the select sort for an array using pointers
: : : : : : : : thanks...
: : : : : : : :
: : : : : : : Here is the selection sort code. You'll have to provide the compare function.
: : : : : : : [code]
: : : : : : : type
: : : : : : : TCompare = function(Item1, Item2: pointer): integer;
: : : : : : : TPointerArray = array[0..16000] of pointer;
: : : : : : :
: : : : : : : procedure SelectionSort(PointerArray: TPointerArray; Compare: TCompare);
: : : : : : : var
: : : : : : : i, j, min: integer;
: : : : : : : temp: pointer;
: : : : : : : begin
: : : : : : : for i := 0 to High(PointerArray)-1 do
: : : : : : : begin
: : : : : : : min := i;
: : : : : : : for j := i+1 to High(PointerArray) do
: : : : : : : if Compare(PointerArray[j], PointerArray[min]) < 0 then
: : : : : : : min = j;
: : : : : : : temp := PointerArray[i];
: : : : : : : PointerArray[i] := PointerArray[min];
: : : : : : : PointerArray[min] := temp;
: : : : : : : end;
: : : : : : : [/code]
: : : : : : :
: : : : : :
: : : : : : I didn't understand what [ high(pointerarray)] means ... and what is the job of the compare function
: : : : : : thanks alot
: : : : : :
: : : : : :
: : : : : High(pointerarray) returns the highest valid index (see help files). Compare() does what the name implies: it compares item1 with item2 and returns a negative value if item1 is smaller than item2, 0 if they are equal and positive if item1 is larger than item2.
: : : : :
: : : :
: : : :
: : : : how can I input the array ... ( can not read or input variables of this type)...
: : : :
: : : : I've made a program that allows me to input numbers using pointers then I added a select sort but it didn't workout can you help me please to check the error... here is the program :
: : : :
: : : :
: : : : uses wincrt;
: : : : type pelem = ^elem;
: : : : elem = record
: : : : key : integer;
: : : : next : pelem;
: : : : end;
: : : :
: : : : var pstart,p,prev: pelem;
: : : : e : elem;
: : : : i,n:integer;
: : : :
: : : : begin
: : : : write('n= ');
: : : : writeln('Input the numbers : ');
: : : : new(pstart);
: : : : pstart^:= e ;
: : : : e.next:= nil;
: : : : {****************************** INPUT ********************************}
: : : : for i:=1 to n do
: : : : begin
: : : : new(p);
: : : : p:= pstart;
: : : : while (p^.next <> nil) do
: : : : p:= p^.next;
: : : : new(P^.next);
: : : : p^.next^:= e;
: : : : e.next:= nil;
: : : : end;
: : : : {******************************* select sort **************************}
: : : :
: : : : p:= pstart;
: : : :
: : : : if (p^.next <> nil) and (p^.key > p^.next^.key) then
: : : : begin
: : : : p^.next:= p^.next^.next;
: : : : new(p^.next^.next); {I think the mistake is here}
: : : : p^.next^.next:=p;
: : : : end;
: : : :
: : : :
: : : : {****************************** OUTPUT *******************************}
: : : : writeln;
: : : : writeln;
: : : : writeln('************************');
: : : : p:= pstart;
: : : :
: : : : while p <> nil do
: : : : begin
: : : : write(P^.key:2);
: : : : p:= p^.next;
: : : : end;
: : : : end.
: : : :
: : : : I'm just a beginer in turbo pascal so thank you for the help
: : : :
: : : The code you posted her isn't an array structure, but a linked list.
: : : As for filling the pointerarray, that greatly depends on the type of the array elements. For example: a pointer array of integers would look something like this:
: : : [code]
: : : GetMem(A[0], SizeOf(Integer));
: : : A[0]^ := 5;
: : : [/code]
: : : while an pointer array of objects would be filled like this:
: : : [code]
: : : var
: : : P: PMyObject;
: : :
: : : New(P, Init);
: : : A[1] := P;
: : : [/code]
: : :
: : : in my code... I tryed the input and the output without sorting the numbers... and it worked very
: : well.. but when I tryed to sort them using the select sort ... it didn't work ...
: : my idea for the sorting as you can see ... is to compare the key of an element with
: : the next one and replacing the pointers if it was bigger..
: :
: :
: Then you wouldn't implement the selection sort, but the bubble sort. Since I don't know your code for the Compare() function or which error you get I cannot help you debug it.
:
i get alot of numbers on the screen.... try to execute it on your computer ...
• [code]
: {******************************* select sort **************************}
:
: p:= pstart;
:
: if (p^.next <> nil) and (p^.key > p^.next^.key) then
: begin
: p^.next:= p^.next^.next;
: new(p^.next^.next); {I think the mistake is here}
: p^.next^.next:=p;
: end;
[/code]
: i get alot of numbers on the screen.... try to execute it on your computer ...
:

Your sort is all wrong. If the first number you enter is smaller than the second, you won't get all the numbers on the screen because it skips over the sort "area".
** On the "area" topic, you should seperate your INPUT/SORT/OUTPUT into seperate procedures/functions for easier viewing, even if they all just access Global variables. **

You code *only* checks the first two numbers, then mixes things up pretty good if the second is smaller than the first.
Since you already have "e" defined as an "elem" then you can use it as a temp storage. For your sort, you will need two loops (as shown in Zibadian's first post). Then first loop will pass from the start of your linked list to the last entry, and the second loop will pass from the position of the first loop until the end. If you encounter a value larger than that of the item in the first loop, then switch the values.

Hope this helps,
Phat Nat