Hi, I'm just starting out in programming and I'm currently making a small program which shows how Bubble, selection and Insertion sorts work. I've found a small program which bubble sorts a user selected number of integers and shows each step at which these are sorted (each pass). However this program doesn't sort the way a bubble sort should work (eg the largest element should be at the last index on the first pass).

I'm in the middle of altering the source code, this is what it was originally:

``````Private Sub Command1_Click()
For x = 1 To UBound(myArr) - 1
For y = (x + 1) To UBound(myArr)
If myArr(x) >= myArr(y) Then
doSwap x, y
End If
Next y
Next x
End Sub``````

you can see that if the first element isn't bigger then the second it will increment only y so if the first elemnt is bigger then the third the first and third will switch positions (like a selection sort).
I want the code to look something like this:

``````Private Sub cmdSort_Click()
For x = 1 To UBound(Sarray) - 1
For y = (x + 1) To UBound(Sarray)
If Sarray(x) >= Sarray(y) Then
doSwap x, y
Else
increment y
increment x
End If
End Sub``````

so that if the first element is smaller then the second, the first element stays in current position and then the second elemnt is compared to the third. Bust since I'm only new to programming i have no idea what to type.

Help is appreciated. Thank you.

Hi,

Use This Code:

``````Dim i As Integer
Dim J As Integer
Dim k
'
For i = 1 To UBound(SArray)
For J = i To 1 Step -1
If Val(SArray(J)) < Val(SArray(J - 1)) Then
k = SArray(J - 1)
SArray(J - 1) = TArr(J)
SArray(J) = k
Else
Exit For
End If
Next
Next``````

Regards
Veena

``````k = SArray(J - 1)
SArray(J - 1) = TArr(J)
SArray(J) = k``````

This just swaps the values right? because i've already got a function 'doSwap' which does it for me.

``````Else
Exit For
End If
Next
Next``````

After the 'else' why does it exit the 'for'? because i want it to increment the two variables if the "IF' statement isn't satisfied.

Why can't I put this in?

``````For x = 1 To UBound(Sarray) - 1
For y = (x + 1) To UBound(Sarray)
If Sarray(x) >= Sarray(y) Then
doSwap x, y
Else
Exit For
Next y
Next x
End If
Next y
Next x``````

I get a compile error stating 'Next without For' on the first Next.

``````For x = 1 To UBound(Sarray) - 1
For y = (x + 1) To UBound(Sarray)
If Sarray(x) >= Sarray(y) Then
doSwap x, y
Else
Exit For
Next y
Next x
End If
Next y
Next x``````

I think that there is really a compiler error here.. you see your ebd if,, it is in a wrong place...

try replacing your code above with this one...
hope it helps

``````For x = 1 To UBound(Sarray) - 1
For y = (x + 1) To UBound(Sarray)
If Sarray(x) >= Sarray(y) Then
doSwap x, y
End If
Next
Next``````

note that I don't use any else statement since if you want to increment just the second ( variable y) as variable x remains in its position then all you have to do is to increment 'y' and after the last element in the array is being compared then that's the only time the variable y increment..

Regards

Cruize²

Hi Cruize,

I've used your code in the program and here is the output (4 array values used).
11 2 5 9
2 11 5 9 ------pass 1
2 5 11 9 ------pass 2
2 5 9 11 ------pass 3
This isn't the expected output, as a bubblesort should bring the largest value to the right of pass 1 (which is 11). It's only sorting by one position at a time, what it should look like is this:
11 2 5 9
2 5 9 11 ----pass 1
2 5 9 11 ----pass 2
the 11 is compared to the 2, since it is greater it is swapped (temp), then it is compared to 5 swapped (temp), then 9 swapped and stored in the last index. After the first pass the x value is incremented as well as y value, so 5 is compared to 9, since it is not greater it doesn't swap and should increment again to x=9 and y=11.

So what it's doing should be shown as one pass, ie the final result of your code should be displayed as the first pass. It's a little difficult with those numbers. Heres another example with 3 values (i've added x and y to show you what i mean):
6 2 0
2 6 0
0 6 2
0 2 6
It should look like this
6 2 0
x y
2 6 0
x y
2 0 6 ---- pass 1
x y
0 2 6
x y
0 2 6 -----pass 2

I got confused, well this is my understanding, correct me if I am wrong,

there should be an indicator to tell if the array is sorted in ascending.. and if not the sorting should continue after each passes...

``````dim check as integer
check = -1

while check=-1
For x = 1 To UBound(Sarray) - 1
y = x + 1;
If Sarray(x) >= Sarray(y) Then
doSwap x, y
End If
Next
'end of the pass
'this would check the array each passes
for x = 1 to UBound(Sarray) -1
if sarray(x) > sarray(x+1)
check=-1
exit for
else
check=0
end if
next
wend``````

I'd like to explain this how, but try it and you'll understand...

Hope this answers your question... sorry for the late post,, I got busy this past few days.. and by the way, I think you can still minimize my code.

Hi,

I've run through the code and done a deskcheck on 4 values and it is correct.
I've made the following chnages to the code as there was 2 lines that wernt accepted.

``````Dim check As Integer
check = -1

While check = -1
For x = 1 To UBound(Sarray) - 1
y = x + 1; 'THIS line wasnt recognised change to y=(x+1) and nothing would work when i click my sort command button
If Sarray(x) >= Sarray(y) Then
doSwap x, y
End If
Next
'end of the pass
'this would check the array each passes
For x = 1 To UBound(Sarray) - 1
If Sarray(x) > Sarray(y) Then 'ADDED THEN and still wouldnt dort so changed x+1 to y and it still didn't work:(
check = -1
Exit For
Else
check = 0
End If
Next
Wend``````

I'm really sorry for the trouble.. I misused the syntax for I have a project on C++ in creating a game. Sorry for the trouble.. and thanks for reminding me. I GOT LOST.... THIS IS VB..

int the first error, there is simple a semicolon in the end of the code... you see.. that shoudn't be there...

about the second mistake I have... I am wondering, wouldn't there should be `y=x+1` before the if statement... since that if you're going to compare the first element and the next...

I've deskchecked and its correct, except it just doesn't seem to work when i click the sort button, perhaps something to do with my doSwap or DoShow functions?
ie i get no errors when i click the sort button, just nothing is displayed.

EDIT: ok i got it to sort, but it still doesn't do it correctly, could it be where my doShow function is? because it occurrs within DoSwap.

Hi Pasta,

Why not try my code..?

REgards
Veena

uhm,, maybe in the doshow code, I don't know your doshow code.. but as QVeen72 said, have you tried her code??

``````Private Sub doShow()
DoEvents
For cnt = 1 To UBound(Sarray)
txtSwap.Text = txtSwap.Text & Sarray(cnt) & " "
Next cnt
txtSwap.Text = txtSwap.Text & vbCrLf
txtSwap.SelStart = Len(txtSwap.Text)
txtSwap.SelLength = 0
End Sub``````

This is executed at the end of the DoSwap function.

Problem solved!
I just had to simply move the do show function to the 'end of the pass, should have clicked earlier, largest number is at the end of array in first pass thanks alot.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.