import
java.util.Arrays;
import
java.util.Comparator;
import
java.util.Random;
class
LinkedListNode {
int
data;
LinkedListNode next;
LinkedListNode(
int
data, LinkedListNode node)
{
this
.data = data;
next = node;
}
}
public
class
GFG2 {
private
static
final
int
SIZE =
7
;
private
static
final
SortByValueComparator
sortByValueComparator
=
new
SortByValueComparator();
public
static
void
heapsort(LinkedListNode node)
{
LinkedListNode head = node;
int
i =
0
;
LinkedListNode[] arr =
new
LinkedListNode[SIZE];
while
(head !=
null
) {
arr[i++] = head;
head = head.next;
}
sortArray(arr);
System.out.println(
"\nLinkedList after sorting: "
);
while
(node !=
null
) {
System.out.print(node.data +
" "
);
node = node.next;
}
}
public
static
void
sortArray(LinkedListNode[] arr)
{
int
n = arr.length;
for
(
int
i = n /
2
-
1
; i >=
0
; i--)
heapify(arr, n, i);
for
(
int
i = n -
1
; i >
0
; i--) {
int
temp = arr[
0
].data;
arr[
0
].data = arr[i].data;
arr[i].data = temp;
heapify(arr, i,
0
);
}
}
public
static
LinkedListNode createLinkedList()
{
Random random =
new
Random();
LinkedListNode head
=
new
LinkedListNode(SIZE,
null
);
LinkedListNode node = head;
for
(
int
i = SIZE -
1
; i >
0
; i--) {
node.next =
new
LinkedListNode(random.nextInt(),
null
);
node = node.next;
}
System.out.println(
"LinkedList before sorting: "
);
node = head;
while
(node !=
null
) {
System.out.print(node.data +
" "
);
node = node.next;
}
return
head;
}
private
static
void
heapify(LinkedListNode[] arr,
int
n,
int
i)
{
int
largest = i;
int
right =
2
* i +
2
;
int
left =
2
* i +
1
;
if
(left < n
&& sortByValueComparator.compare(arr[left],
arr[largest])
>
0
)
largest = left;
if
(right < n
&& sortByValueComparator.compare(arr[right],
arr[largest])
>
0
)
largest = right;
if
(largest != i) {
int
swap = arr[i].data;
arr[i].data = arr[largest].data;
arr[largest].data = swap;
heapify(arr, n, largest);
}
}
public
static
void
main(String[] args)
{
LinkedListNode node = createLinkedList();
heapsort(node);
}
}
class
SortByValueComparator
implements
Comparator<LinkedListNode> {
public
int
compare(LinkedListNode node1,
LinkedListNode node2)
{
if
(node1.data < node2.data) {
return
-
1
;
}
else
if
(node1.data > node2.data) {
return
1
;
}
return
0
;
}
}