Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Searching and Sorting

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 30

Session 9

Searching And Sorting

During this session you will learn about:

 Searching and sorting techniques.


 Linear and binary search methods.
 Selection sort.
 Bubble sort.
 Merge sort.
 Quick sort.
 Radix sort.
 Heap sort.

9.1. Introduction

In many cases we require the data to be presented in


the form where it follows certain sequence of the
records. If we have the data of the students in the
class, then we will prefer to have them arranged in the
alphabetical manner. For preparing the result sheet, we
would like to arranger the data as per the examination
numbers. When we prepare the merit list we would like to
have the same data so that it is arranged in the
decreasing order of the total marks obtained by the
students.

Thus arranging the data in either ascending or


descending manner based on certain key in the record is
known as SORTING. As we do not receive the data in the
sorted form, we are required to arrange the data in the
particular from. For ascending order we will require the
smallest key value first. Thus till we do not get all
the data items, we cannot start arranging them.
Arranging the data as we receive it is done using linked
lists. But in all other cases, we need to have all the
data, which is to be sorted, and it will be present in
the form of an ARRAY. Sometimes it is very important to
search for a particular record, may be, depending on some
value. The process of finding a particular record is
known as SEARCHING.

9.2. Searching Techniques

Data Structures with ‘C’ 197


We will discuss two searching methods – the
sequential search and the binary search.

9.2.1. Sequential Search

This is a natural searching method. Here we search


for a record by traversing through the entire list from
beginning until we get the record. For this searching
technique the list need not be ordered. The algorithm is
presented below:

1. Set flag =0.


2. Set index = 0.
3. Begin from index at first record to the end of the
list and if the required record is found make flag =
1.
4. At the end if the flag is 1, the record is found,
otherwise the search is failure.

int Lsearch(int L[SIZE], int ele )


{
int it;
for(it = 1; it<=SIZE; it++)
{
if( L[it] == ele)
{
return 1;
break;
}
}
return 0;
}

Analysis

Whether the search takes place in an array or a


linked list, the critical part in performance is the
comparison in the loop. If the comparisons are less the
loop terminates faster.

The least number of iterations that could be required is


1 if the element that was searched is first one in the
list. The maximum comparison is N ( N is the total size
of the list), when the element is the last in the list.
Thus if the required item is in position ‘i’ in the list,
‘i’ comparisons are required. Hence the average number of
comparisons is
1 + 2 + 3 + .... + I + ... + N

Data Structures with ‘C’ 198


N
N(N+1)
= --------
2 * N

= (N + 1) / 2.
Sequential search is easy to write and efficient for
short lists. It does not require the list to be sorted.
However if the list is long, this searching method
becomes inefficient, as it has to travel through the
whole list. We can overcome this shortcoming by using
Binary Search Method.

9.2.2. Binary Search

Binary search method employs the process of


searching for a record only in half of the list,
depending on the comparison between the element to be
searched and the central element in the list. It requires
the list to be sorted to perform such a comparison. It
reduces the size of the portion to be searched by half
after each iteration.

Let us consider an example to see how this works.

The numbers in the list are 10 20 30 40 50 60 70 80 90.

The element to be searched is 30.

First it is compared with 50(central element).


Since it is smaller than the central element we consider
only the left part of the list(i.e. from 10 to 40) for
further searching.
Next the comparison is made with 30 and returns as search
is successful.

Let us see the function, which performs this on the list.

int Bsearch(int list[SIZE],int ele)


{
int top, bottom, middle;

top= SIZE –1;


bottom = 0;

while(top > = bottom)


{
middle = (top + bottom)/2;

Data Structures with ‘C’ 199


if(list[middle]==ele)
return middle;
else
if(list[middle]< ele)
bottom = middle + 1;
else
top = middle –1;
}
return –1;
}

Analysis

In this case, after each comparison either the


search terminates successfully or the list remaining to
be searched, is reduced by half. So after k comparisons
the list remaining to be searched is N/ 2^k where N is
the number of elements. Hence even at the worst case this
method needs no more than log2N + 1 comparisons.

9.3 Sorting

Arranging the data in either ascending or descending


manner based on certain key in the record is known as
SORTING. We will learn selection sort, Bubble sort,
Quick sort, Merge sort, Radix sort and Heap sort. We will
give the algorithms/pseudo codes for these sorts.
Students can write the program for these and test them.

9.3.1. Selection Sort

Assume we have an array ‘K’ with ‘N’ number of


elements. This algorithm arranges elements in ascending
order. ‘Pass’ is an index variable, which indicates the
number of passes. The variable ‘min_index’ denotes the
position of the smallest element encountered in that
pass. ‘I’ is another index variable. The array and the
size are passed to the function.

1. Using Pass index variable repeat steps from first


record to last – 1 records and perform all the steps
up to 4.
2. Initialize the minimum index as
min_index = pass.
3. Obtain the element with the smallest value.
for(i= pass+1; i < N; i++)

Data Structures with ‘C’ 200


{
if( K[i] < K[min_index])
min_index = i;
}

4. exchange the elements


if(min_index != pass)
{
temp = K[pass];
K[pass] = K[min_index];
K[min_index] = temp;
}

Analysis:

In the first pass N-1 records are examined.


In the second pass N-2 records are examined.
In the third pass N-3 records are examined.

Therefore in ith pass – (N-i) records are examined.

Therefore the efficiency is given by N(N-1)/2


= O(N2)

Trace of Selection Sort

1 42 11 11 11 11

2 23 23 23 23 23

3 74 74 74 42 42

4 11 42 42 74 65

5 65 65 65 65 74

fig 1. trace of selection sort

9.3.2.Bubble sort

The technique of the bubble sort is very simple. We


will first find the smallest number and its location in
the array and then we will swap the smallest number with
the number in the first position. Thus when we go
through all the n elements, which are present in the
array, we can fix the position of one element i.e. the
smallest.

Data Structures with ‘C’ 201


Now we will repeat the process for the remaining (n-
10) elements. We will find the smallest among those (n-
1) elements and place it at the second location in the
array.

The process is repeated till we do not place the


last element, i.e. the largest value in the last
position.

We can write it in C as shown below:

Here we are required to arrange the students’ data as per


the names.

struct stud
{
char name [20];
float per _marks;
}p[SIZE];

We have declared the array of structure to contain


SIZE records. The reading part is easy, and we read n
records(say).

The process of sorting is as follows:

for( i=0; i < n; i++)


for (j= i+1 ; j<n; j++)
if(strcmp(p[i].name, p[j]. name)==1)
swap (p,i,j);

Thus swap function is passed the information that


the ith records should be swapped with the jth record.
But since we perform the swapping every time and it will
be very time consuming.

The code can be modified as shown below.

for(i=0; i<n; i++)


{
min = i+1;
for (j=i+l; j<n-l; j++)
if(strcmp(p[min].name, p[j].name)==1)
min =j;
swap (p, i, min);
}

Data Structures with ‘C’ 202


Thus we will find the position of the smallest,
which will be min and then the swapping will be done only
once for placing the record in proper position. The sense
of bubbling the data to its place is not achieved in this
case.

Total number of comparisons in Bubble sort is


=( N –1) + (N-2) + ... + 2 + 1
=(N-1)*N/2
= O(N2)

Trace of Bubble Sort


1 42 23 23 23 23 23 23 23 11 11

2 23 42 42 42 42 42 11 11 23 23

3 74 : 74 11 11 : 42 42 : 42

4 11 : : 74 65 : : 65 : 65

5 65 : : : 74 : : 74 : 74

This process continues until all the elements are sorted.

fig 2 trace of Bubble sort

9.3.3 Merge Sort

We know that merging of the two sorted arrays can be


done so that resulting array will also be in the sorted
form. If we decide to use the same technique for
creating the sorted array, then the requirement will be
the two arrays, which we are going to merge, must be
sorted.

To sort the array, we will use the merging technique


and that merging will again require the arrays to be
sorted. But we can say that a single element will be
always in the sorted form. Thus to implement merge sort
we will first merge first element with second, generating
a list of sorted element which contain two elements. The
process is repeated for third & fourth, fifth & sixth
etc.

A single element is always in the sorted form. Thus


we will have sorted lists most of which contain two
elements. If we merge first two, we will get a sorted
list of four elements. Thus we will go on building the

Data Structures with ‘C’ 203


sorted array. At pass i, each vector contains 2i elements
except may be in the last vector.

Consider an example to show this.

Original list: 12 30 10 8 15 100 2 33 67 5

Pass 1 12 30 8 10 15 100 2 33 5 67

Pass 2 8 10 12 30 2 15 33 100 5 67

Pass 3 2 8 10 12 15 30 33 100 5 67

Pass 4 2 5 8 10 12 15 30 33 67 100
fig 3. Trace of merging process
Here we will write two functions, two_way_mergesort
(K,I,N) and simple_merge(K,first,second,third).

Because of its recursive nature we can use recursive


algorithm. First we will see an algorithm for simple
merging process.

Algorithm for simple_merge(K[], first, second, third)

This algorithm performs a simple merge process. We


also need a temp[] table for merging process. The
variables ‘i’ and ‘j’ are two indices or cursors in the
table first[] and second[]. The variable ‘p’ is a cursor
associated with the temp[].
1. initialize
i = first;
j = second;
p = 0;

2. Compare the corresponding elements and output the


smallest.

While(i < second and j<= third)


{
if(K[i] <= K[j])
{
p = p+1;
temp[p] = K[i];
i = i+1;
}
else
{
p = p+1;
temp[p] = K[j];

Data Structures with ‘C’ 204


j = j+1;
}
}

3. copy remaining unprocessed elements.


if( i >= second)
{
while( j <= third) (first list is processed
and
second list is not
processed)

{
p = p+1;
temp[p] = K[j];
j = j+1;
}
}
else (first sublist has elements left) {
while( i < second)
{
p = p+1;
temp[p] = K[i];
i = i+1;
}

4. copy elements from temp to K back. This is done to


save memory.
for(i=1; i<= p; i++)
K[first – p – i]= temp[i];
Here p contains total number of elements.

5. return to the calling function.

Note: K[first-p-i] is used in step 4 instead of K[i]


because merging at different levels with different sub
lists takes place but their positions should be
maintained in the list.

Now, the algorithm for


two_way_mergesort(K[],start,finish)

In this vector K is sorted recursively with its


elements between positions start and finish inclusive.
SIZE denotes the number of elements in the current sub
table to be sorted. Middle denotes the position of the
middle element of that sub table.

1. Compute the size of the current sub table.

Data Structures with ‘C’ 205


SIZE = finish – start +1;

2. Test for a base condition when the sub table has the
size 1 recursive call must stop.
if(SIZE < = 1)
return;
3. Calculate the midpoint of the current sub table.
Middle = start +[SIZE/2]-1.
This is because start is not always 1 but changes
for different sub tables.

4. Recursively sort first part of the list.


two_way_mergesort(K[],start, middle);

5. Recursively sort second part of the list.


two_way_mergesort(K[],middle+1, finish);

6. Merge two ordered tables.


simple_merge(K[],start,middle+1,finish);

7. return;

Merge sort is the best method for sorting linked


lists in random order. The total computing time is O(N
log2 N).

9.3.4. Quick Sort(Partition Exchange Sort)

In this method we take one number and find its


position, but at the same time we swap the data in such
manner that when the number occupies is correct position,
all the numbers on the left of it are less than that it
where as the numbers on the right are greater than that
number.

When we say that we want to find the correct


position of the number when they are arranged in the
ascending manner, we will have to find how many numbers
are less than the number under consideration. Instead of
actually counting as how many numbers are less, we
perform the following steps.

1. i = 0 initial position of the number, whose new


position we will be finding.
2. first = i +1
3. Last = n
4. Compare the number at position first with the number at
position last.

Data Structures with ‘C’ 206


5. The number at first position must be less than the
number at last position if not then swap the numbers.
6. Move first towards right i.e. first ++
7. Move last towards left i.e. last --
8. If position first and last have not crossed each other
than repeat from step 4
9. Now swap the I the number with number at position first
- 1.
10. Thus the number is properly placed at position first
- 1
11. Repeat the process for the left part as well as
right part.

The function thus can be written in the recursive


from. The program for quick sort is :

# include<stdio.h>

int, stk[30], top =-1, b[20];

readara()
{
int i, m;
printf ("give the number of elements in an array:");
scanf("%d",&m);

for (i=0; i<m;i++)


{
printf ("%d postion :",i)
scanf ("d%" &b[i];
}
return (m)
}

printara (int m)
{
int i;
for (i=0; i<m;i++)
printf("%d\t", b[i]);
}

swap (int p, int q)


{
int temp;
temp=b[p]
b[p]=b[q]
b[q]=temp
}

Data Structures with ‘C’ 207


qsort (int m)
{
int, l, r,e,f;
push (0);
push (m-1);
do
{
r=pop();
l=pop();
print f ("\n********** after poping ********\n");
printf ("left = %d, right = %d\n", l,r);
getch();

printf(" ____________________________\n")
if (l<r)
{
f=l+1;
e =r;
do
{
while (b[l] > b[f] && f<=e)
f++;
while (b[l] <b[e] && f<=e)
e--;
if (f<e)
swap (f e);
}while (f-1, l);

swap (f-1, l);

printf ("Swapping %d position with %d\n", f-1, l)


printara(m);
printf("\n");
getch();

if(l<f-2)
{
push (l);
push (f-2);
}

if (f<r)
{ push (f);
push (r);
}
}
}while (!stkempty());
}

Data Structures with ‘C’ 208


stkempty ( )
{
return (top ==-1);
}

push (int val)


{
top ++;
stk[top] = val;
}

pop()
{
top --;
return (stk[top+1]);
}

main()
{
int n;
clscr ();
n=readara();
qsort (n);
printf("n\n********* sorted array is .. *******\n");
printara(n);
}

Give the number of elements in an array :8


0 position : 20
1 position : 3
2 postion : 45
3 position : 44
4 position : 27
5 position : 11
6 position : 6
7 position : 70

********** after poping ********


left =0 right =7
_________________________________________________________
_____

swapping 3 position with 0


11 3 6 20 27 44 45 70

***********after poping ********


left =4 right =7
_________________________________________________________
_____

Data Structures with ‘C’ 209


swapping 4 postion with 4
11 3 6 20 27 44 45 70

********** after poping*********


left =5 right =7
_________________________________________________________
_____

swapping 5 position with 5


11 3 6 20 27 44 45 70

*********** after poping *******


left = 6 right =7
_________________________________________________________
_____

swapping 6 position with 6


11 3 6 20 27 44 45 70

********** after poping ********


left = 0 right = 2
_________________________________________________________
_____
swapping 2 position with 0
6 3 11 20 27 44 45 70

*********** after poping *******


left =0 right =1
_________________________________________________________
_____
Swapping 1 position with 0
3 6 11 20 27 44 45 70

**************** s o r t e d a r r a y i s … *******
3 6 11 20 27 44 45 70
_________________________________________________________
_____

This sort uses O(N log2N) comparisons on average. So


far we have used the central element as the partitioning
element. The performance can be improved by choosing a
suitable partitioning element depending on the
application.

9.3.5. Radix Sort

This is a formal algorithm predating computers. This


was first devised for punched cards but is very efficient

Data Structures with ‘C’ 210


for sorting linked lists. The sorter used to place all
cards containing a given digit in an appropriate pocket.
There are 10 pockets for 10 digits. If character strings
are to be used we need 26 pockets. Let us explore this
method with an example. Now the procedure is followed
considering the least significant digit (rightmost
digit).

Consider numbers
42 23 74 11 65 57 94 36 99 87 70 81
61

Pass 1: P0 P1 P2 P3 P4 P5 P6 P7 P8 P9

70 11 42 23 74 65 36 57 99
81 94 87
61

Now combine the contents of the pockets starting from


zero and in each pocket first element first basis. So the
numbers now will be in the order

70 11 81 61 42 23 74 94 65 36 57 87
99

Now the procedure is repeated consider the second least


significant digit.

Pass 2: P0 P1 P2 P3 P4 P5 P6 P7 P8 P9

11 23 36 42 57 61 70 81 99
65 74 87

Now combine the contents of the pockets starting from


zero and in each pocket first element first basis. So the
numbers now will be in the order

11 23 36 42 57 61 65 70 74 81 87 99

Therefore number of passes used is maximum number of


digits present in any number. If maximum number of digits
in a key is m them m successive passes from unit digit to
the most significant digit are required to sort the list.

Each pocket is represented using a first in first


out data structure Queue.

The algorithm is as follows:

Data Structures with ‘C’ 211


In this algorithm we consider a table of ‘N’ records
arranged as a linked list. The values are represented in
‘K’ field of the list and there is a ‘link’ pointer. The
address of the first list is stored in ‘first’. ‘T’ and
‘B’ are two vectors that store rear and front of the
queue. The records T[i] and B[i] point to top and bottom
records in the pocket. The variable ‘j’ is a pass index.
The pointer ‘r’ denotes current record address, ‘next’
pointer denotes next record to be examined, and ‘prev’
pointer is used during the combining of pockets. ‘d’
denotes the current digit in the key.

1. while( j <= N)
{
2. for( i = 0; i<=9; i++)
T[i]=B[i]=NULL; (initialization)
r=first;

3. while( r != NULL)
{

d = jth(K(r)); /* function that returns jth


digit */
next = r->link;

if(T[d] == NULL)
T[d]=B[d]=r;
else
{
T[d]->link = r;

}
r->link = NULL;
r=next;

4. p=0;
while(B[p] == NULL)
{
p = p+1;
}
first = B[p];

while(i=p+1; i<=9;i++)
{
prev =T[i-1];
}
if(T[i] != NULL)
{

Data Structures with ‘C’ 212


prev->link = B[i];
}
else
{
T[i]=prev;
}
}

5. return.

Trace of Radix sort.

T[0] / 70 B[0]

T[1] / 61 81 11
B[1]

T[2] / 42 B[2]

T[3] / 23 B[3]

T[4] / 94 74 B[4]

T[5] / 65 B[5]

T[6] / 36 B[6]

T[7] / 87 57 B[7]

T[8] NULL B[8]

T[9] / 99 B[9]

PASS 1

T[0] NULL B[0]

T[1] / 11 B[1]

T[2] / 23 B[2]

T[3] / 36 B[3]

T[4] / 42 B[4]

T[5] / 57 B[5]

Data Structures with ‘C’ 213


T[6] / 65 61 B[6]

T[7] / 74 70 B[7]

T[8] / 87 81 B[8]

T[9] / 99 94 B[9]

PASS 2

fig 4. trace of radix sort

9.3.6. Heap Sort

A heap is an almost complete binary tree. In this


tree, if the maximum level is ‘i’, upto (i-1)th level the
tree should be complete i.e., the number of elements in
(i-1)th level should be 2i-1 . In the level i, number of
nodes can be less than 2i, then the nodes in that level
should be completely filled, only from left to right. A
heap can either be an ascending heap or a descending
heap.

The property of an ascending heap is that, the root


is the lowest and given any other node i, that node
should be less than its left child and the right child.
The property of an ascending heap is that, the root is
the lowest and given any other node i, that node should
be more than its left child and the right child.

The algorithm is also called tree sort. It consists of


two phases, construction process and traversal process.

Creation

General algorithm.

We will repeat all the steps below until there are still
records.

1. Obtain the child to be placed in the heap.


2. Obtain the position of parent for this child.
3. Repeat through step 5 while the child has a parent
and the key of the child is greater than its parent.
4. Move parent down to the position of the child.
5. Obtain position of new parent for the child.
6. copy the child into its proper place.

Data Structures with ‘C’ 214


The pseudo code for this algorithm is as follows:

Create_heap(K[],N)

Where k is a vector of N records.


Q is a variable, which controls the no. of insertions.
J is the index of the parent key K[i]
Key record that has to be inserted into the current heap.

1. we will repeat all the steps from Q=2 till there


are no records.
2. i = Q;
Key = K[Q];
3. J = (i/2); /* obtain parent */
4. while( i > 1 && Key > K[J])
5. {
temp = K[i];
K[i]=K[J];
K[J]=temp;

6. i = J; /* obtain new parent */


J = (i/2);
If(J < 1)
J=1;
}

7. copy new record in its proper place.


K[i] = Key;

8. Return;

Trace of Create Heap:

Input list : 42 23 74 11 65 03 94 36 99 87

Step 1:
1. Q=2
2. i=2 Key = 23
3. J=1
7. K[2]=23

42

23

Step 2:

Data Structures with ‘C’ 215


1. Q=3
2. i=3 Key = 74
3. J=1
4. true
5. K[3]=42
6. i=1 j=1
7. K[1]=74

74 k1

k2 23 42 k3

Step 3:
1. Q=4
2. i=4 Key = 11
3. J=2
4. false
7. K[4]=11

74 k1

k2 23 42 k3

k4 11

Step 4:
1. Q=5
2. i=54 Key = 65
3. J=2
4. true
5. K[5]=23
6. j=2
7. K[2]=65

74 k1

k2 65 42 k3

k4 11 23 k5

Step 5:
1. Q=6

Data Structures with ‘C’ 216


2. i=6 Key = 03
3. J=3
4. false
7. k[6]=3
74 k1

k2 65 42 k3

k4 11 23 k5 3 k6

Step 6:
1. Q=7
2. i=7 Key = 94
3. J=3
4. true
5. K[7]=42
6. i=3 j=1
4. true
5. K[3]=74
6. i = 1 j =1
4. false
7. K[1]=94

94 k1

k2 65 74 k3

k4 11 23 k5 3 k6 42 k7

Step 7:
1. Q=8
2. i=87 Key = 36
3. J=4
4. true
5. K[8]=11
6. i=4 j=2
4. false
7. K[4]=36
94 k1

k2 65 74 k3

k4 36 23 k5 3 k6 42 k7

Data Structures with ‘C’ 217


11 k8

Step 8:
1. Q=9
2. i=9 Key = 99
3. J=4
4. true
5. K[9]=36
6. i=4 j=2
4. true
5. K[4]=65
6. i=2 j=1
4. true
5. K[2]=94
7. i=1 j=1
4. false
7. K[1]=99

99 k1

k2 94 74 k3

k4 65 23 k5 3 k6 42 k7

11 k8 36 k9

Step 9:
1. q=10
2. i=10 Key = 87
3. J=5
4. true
5. K[10]=23
6. i=5 j=2
4. false
7. K[5]=87

99 k1

k2 94 74 k3

Data Structures with ‘C’ 218


k4 65 87 k5 3 k6 42 k7

11 k8 k9 36 23 k10

Since all the elements are over Q=N, heap creation


process stops.

Sorting of Heap

Once we create the heap the record with the largest


key will be present as a root. It can be written out
directly. This is done by replacing K[1] with K[n]. Then
we can reconstruct the heap for N-1 records by the end of
which K[1] will have the second largest element. This
process continues for all the elements. This
reconstruction can be done in two methods:

1. After placing the root value in its proper


position we can pass the remaining elements to
create a new heap. This process is continued
until all the elements are over. But this method
is not efficient.

Thealgorithm for this is simple:


1.create initial heap.
2.Repeat through step 4 a total of N-1 times.
3.Exchange first record with the last unsorted
record.
4. create heap with remaining unsorted elements.

2. In the second method after placing the root value


in its proper place we readjust the elements in
the heap. After this readjustment the largest
element will again be placed in the node. This
process is continued until all the elements are
sorted.

General algorithm for sorting with readjustments:

5. create initial heap.


6. Repeat through step 8 a total of N-1 times.
7. Exchange first record with the last unsorted
record.

Data Structures with ‘C’ 219


8. Obtain the index of the largest son of a new
record.
9. Repeat through step8 for the unsorted elements
in the heap and while current element is
greater than the first element.
10. Interchange records and obtain the next
left son.
11. Obtain the index of the next biggest son.
12. copy the record into its proper place.

The pseudo code for the above algorithm is given below.

Heap_Sort(K[],N)

K is an array with size N


Q is the Pass index.
I,J are index variables.
Key- Key record being swapped at each pass.

1. Create initial heap using the previous function.


Create_Heap(K[],N).
2. While( Q = N; Q<=2; Q--)
3. {
temp = K[1];
K[1] = K[Q];
K[Q]=temp;

4. I=1;
Key= K[1];
J=2;

5. if( J+1 < Q)


{
if(K[J+1]>K[J])
J=J+1;
}
6. reconstruct a new heap.
While( J <= Q-1 && K[j] > Key)
{
7. temp = K[1];
K[1] = K[Q];
K[Q]=temp;
}
8. Obtain next leftson
I = J;
J = 2*I;
9. Obtain the index of next largest son
if(J+1<Q)

Data Structures with ‘C’ 220


{
if(K[J+1]>K[J])
{
J=J+1;
}
else
if(J>N)
J=N;
}
10. copy record in its proper place.

K[i]=Key;

Trace of Heap Sort:

1. 99 k1

k2 94 74 k3

k4 65 87 k5 3 k6 42 k7

11 k8 k9 36 23 k10

Initial Heap

2. Q=10
3. K[1] = 23 K[10]=99

23 k1

k2 94 74 k3

k4 65 87 k5 3 k6 42 k7

11 k8 k9 36

99

Data Structures with ‘C’ 221


4. I = 1 KEY=23 J=2
5. if(I+1)<10 /* true */
if 74 > 94 /* false */

6. if J<=9 && K[j] >23


7. K[1]=94 94 k1

8. I=2 J=4
9. if 5<10 /*true */
if 87 >65
I=J+1=5
10. K[2]=23 94 k1

23 k2
6. J<=9 && K[5]>23
7. K[2]=87
8. I=5 J=9
9. K[5]=23

94 k1

k2 87 74 k3

k4 65 23 k5 3 k6 42 k7

11 k8 k9 36

We have seen step by step approach of readjustment in


previous step. Here onwards we will just write the
initial heap and the heap after readjustment for each
step.

Step 2:

36 k1

k2 87 74 k3

k4 65 23 k5 3 k6 42 k7

Data Structures with ‘C’ 222


11 k8

94 99

K[9] K[10]

After readjustment the heap will be

87 k1

k2 65 74 k3

k4 36 23 k5 3 k6 42 k7

11 k8

Step 3:

11 k1

k2 65 74 k3

k4 36 23 k5 3 k6 42 k7

87 94 99
K[8] K[9] K[10]

After readjustment the heap will be

74 k1

k2 65 42 k3

Data Structures with ‘C’ 223


k4 36 23 k5 3 k6 11 k7

Step 4:

11 k1

k2 65 42 k3

k4 36 23 k5 3 k6

74 87 94 99
K[7]K[8] K[9]
K[10]

After readjustment the heap will be

65 k1

k2 36 42 k3

k4 11 23 k5 3 k6

step 5:
3 k1

k2 36 42 k3

k4 11 23 k5

65 74 87 94 99
K[6]K[7]K[8] K[9]
K[10]

After readjustment the heap will be

42 k1

Data Structures with ‘C’ 224


k2 36 3 k3

k4 11 23 k5

step 6:

23 k1

k2 36 3 k3

k4 11

42 65 74 87 94 99
K[5]K[6]K[7]K[8] K[9]
K[10]

After readjustment the heap will be

36 k1

k2 23 3 k3

k4 11

step 7:
11 k1

k2 23 3 k3

36 42 65 74 87 94 99
K[4]K[5]K[6]K[7]K[8] K[9]
K[10]

After readjustment the heap will be

Data Structures with ‘C’ 225


23 k1

k2 11 3 k3

step 8:

3 k1

k2 11

23 36 42 65 74 87 94 99
K[3]K[4]K[5] K[6]K[7]K[8] K[9]
K[10]

After readjustment the heap will be

11 k1

k2 3

Step 9:
3

11 23 36 42 65 74 87 94 99
K[2]K[3]K[4]K[5] K[6]K[7]K[8] K[9]
K[10]

Therefore after N-1 repeatitions the list is sorted.


03 11 23 36 42 65 74 87 94 99
K[1] K[2]K[3]K[4]K[5] K[6]K[7]K[8] K[9]
K[10]

Data Structures with ‘C’ 226

You might also like