import
java.util.ArrayList;
class
Node {
int
data;
Node nextNode;
Node(
int
data)
{
this
.data = data;
this
.nextNode =
null
;
}
}
class
LinkedList {
Node head;
LinkedList() {
this
.head =
null
; }
void
insert(
int
data)
{
Node newNode =
new
Node(data);
if
(
this
.head ==
null
|| data <
this
.head.data) {
newNode.nextNode =
this
.head;
this
.head = newNode;
}
else
{
Node current =
this
.head;
while
(current.nextNode !=
null
&& current.nextNode.data < data) {
current = current.nextNode;
}
newNode.nextNode = current.nextNode;
current.nextNode = newNode;
}
}
}
public
class
AddressCalculationSorting {
static
final
int
SIZE =
10
;
static
int
hashFunction(
int
num,
int
maximum)
{
int
address
= (
int
)((num *
1.0
/ maximum) * (SIZE -
1
));
return
address;
}
static
void
addressCalculationSort(ArrayList<Integer> arr)
{
ArrayList<LinkedList> listOfLinkedLists
=
new
ArrayList<>(SIZE);
for
(
int
i =
0
; i < SIZE; ++i) {
listOfLinkedLists.add(
new
LinkedList());
}
int
maximum = arr.stream()
.mapToInt(Integer::intValue)
.max()
.getAsInt();
for
(
int
val : arr) {
int
address = hashFunction(val, maximum);
listOfLinkedLists.get(address).insert(val);
}
for
(
int
i =
0
; i < SIZE; ++i) {
Node current = listOfLinkedLists.get(i).head;
System.out.print(
"ADDRESS "
+ i +
": "
);
while
(current !=
null
) {
System.out.print(current.data +
" "
);
current = current.nextNode;
}
System.out.println();
}
int
index =
0
;
for
(
int
i =
0
; i < SIZE; ++i) {
Node current = listOfLinkedLists.get(i).head;
while
(current !=
null
) {
arr.set(index, current.data);
index++;
current = current.nextNode;
}
}
}
public
static
void
main(String[] args)
{
ArrayList<Integer> arr =
new
ArrayList<>();
arr.add(
29
);
arr.add(
23
);
arr.add(
14
);
arr.add(
5
);
arr.add(
15
);
arr.add(
10
);
arr.add(
3
);
arr.add(
18
);
arr.add(
1
);
System.out.print(
"Input array: "
);
for
(
int
x : arr) {
System.out.print(x +
" "
);
}
System.out.println();
addressCalculationSort(arr);
System.out.println();
System.out.print(
"Sorted array: "
);
for
(
int
x : arr) {
System.out.print(x +
" "
);
}
System.out.println();
}
}