Utoljára aktív 1718984838

SortingExamples.java Eredeti
1import java.util.Arrays;
2import java.util.Scanner;
3
4public class SortingExamples {
5 public static void main(String[] args) {
6 Scanner input = new Scanner(System.in);
7
8 // Input array from the user
9 System.out.print("Enter the number of elements in the array: ");
10 int n = input.nextInt();
11 int[] arr = new int[n];
12
13 System.out.println("Enter the elements of the array:");
14 for (int i = 0; i < n; i++) {
15 arr[i] = input.nextInt();
16 }
17
18 // Choose a sorting algorithm
19 System.out.println("\nChoose a sorting algorithm (1-10):");
20 System.out.println("1- Selection sort");
21 System.out.println("2- Bubble sort");
22 System.out.println("3- Insertion sort");
23 System.out.println("4- Merge sort");
24 System.out.println("5- Quick sort");
25 System.out.println("6- Heap sort");
26 System.out.println("7- Counting sort");
27 System.out.println("8- Radix sort");
28 System.out.println("9- Bucket Sort");
29 System.out.println("10- Shell Sort");
30 System.out.print("Enter your choice: ");
31 int choice = input.nextInt();
32
33 switch (choice) {
34 case 1:
35 selectionSort(arr);
36 break;
37 case 2:
38 bubbleSort(arr);
39 break;
40 case 3:
41 insertionSort(arr);
42 break;
43 case 4:
44 mergeSort(arr);
45 break;
46 case 5:
47 quickSort(arr, 0, n - 1);
48 break;
49 case 6:
50 heapSort(arr);
51 break;
52 case 7:
53 countingSort(arr);
54 break;
55 case 8:
56 radixSort(arr);
57 break;
58 case 9:
59 bucketSort(arr);
60 break;
61 case 10:
62 shellSort(arr);
63 break;
64 default:
65 System.out.println("Invalid choice. No sorting performed.");
66 }
67
68 // Print the sorted array
69 System.out.println("Sorted array: " + Arrays.toString(arr));
70 }
71
72 // Selection Sort
73 public static void selectionSort(int[] arr) {
74 int n = arr.length;
75 for (int i = 0; i < n - 1; i++) {
76 int minIndex = i;
77 for (int j = i + 1; j < n; j++) {
78 if (arr[j] < arr[minIndex]) {
79 minIndex = j;
80 }
81 }
82 int temp = arr[minIndex];
83 arr[minIndex] = arr[i];
84 arr[i] = temp;
85 }
86 }
87
88 // Bubble Sort
89 public static void bubbleSort(int[] arr) {
90 int n = arr.length;
91 boolean swapped;
92 for (int i = 0; i < n - 1; i++) {
93 swapped = false;
94 for (int j = 0; j < n - i - 1; j++) {
95 if (arr[j] > arr[j + 1]) {
96 int temp = arr[j];
97 arr[j] = arr[j + 1];
98 arr[j + 1] = temp;
99 swapped = true;
100 }
101 }
102 if (!swapped) {
103 break;
104 }
105 }
106 }
107
108 // Insertion Sort
109 public static void insertionSort(int[] arr) {
110 int n = arr.length;
111 for (int i = 1; i < n; i++) {
112 int key = arr[i];
113 int j = i - 1;
114 while (j >= 0 && arr[j] > key) {
115 arr[j + 1] = arr[j];
116 j--;
117 }
118 arr[j + 1] = key;
119 }
120 }
121
122 // Merge Sort
123 public static void mergeSort(int[] arr) {
124 mergeSort(arr, 0, arr.length - 1);
125 }
126
127 private static void mergeSort(int[] arr, int left, int right) {
128 if (left < right) {
129 int mid = (left + right) / 2;
130 mergeSort(arr, left, mid);
131 mergeSort(arr, mid + 1, right);
132 merge(arr, left, mid, right);
133 }
134 }
135
136 private static void merge(int[] arr, int left, int mid, int right) {
137 int n1 = mid - left + 1;
138 int n2 = right - mid;
139 int[] L = new int[n1];
140 int[] R = new int[n2];
141
142 for (int i = 0; i < n1; i++) {
143 L[i] = arr[left + i];
144 }
145 for (int i = 0; i < n2; i++) {
146 R[i] = arr[mid + 1 + i];
147 }
148
149 int i = 0, j = 0, k = left;
150 while (i < n1 && j < n2) {
151 if (L[i] <= R[j]) {
152 arr[k] = L[i];
153 i++;
154 } else {
155 arr[k] = R[j];
156 j++;
157 }
158 k++;
159 }
160
161 while (i < n1) {
162 arr[k] = L[i];
163 i++;
164 k++;
165 }
166
167 while (j < n2) {
168 arr[k] = R[j];
169 j++;
170 k++;
171 }
172 }
173
174 // Quick Sort
175 public static void quickSort(int[] arr, int low, int high) {
176 if (low < high) {
177 int pivotIndex = partition(arr, low, high);
178 quickSort(arr, low, pivotIndex - 1);
179 quickSort(arr, pivotIndex + 1, high);
180 }
181 }
182
183 private static int partition(int[] arr, int low, int high) {
184 int pivot = arr[high];
185 int i = low - 1;
186 for (int j = low; j < high; j++) {
187 if (arr[j] < pivot) {
188 i++;
189 int temp = arr[i];
190 arr[i] = arr[j];
191 arr[j] = temp;
192 }
193 }
194 int temp = arr[i + 1];
195 arr[i + 1] = arr[high];
196 arr[high] = temp;
197 return i + 1;
198 }
199
200 // Heap Sort
201 public static void heapSort(int[] arr) {
202 int n = arr.length;
203 for (int i = n / 2 - 1; i >= 0; i--) {
204 heapify(arr, n, i);
205 }
206 for (int i = n - 1; i >= 0; i--) {
207 int temp = arr[0];
208 arr[0] = arr[i];
209 arr[i] = temp;
210 heapify(arr, i, 0);
211 }
212 }
213
214 private static void heapify(int[] arr, int n, int i) {
215 int largest = i;
216 int left = 2 * i + 1;
217 int right = 2 * i + 2;
218
219 if (left < n && arr[left] > arr[largest]) {
220 largest = left;
221 }
222 if (right < n && arr[right] > arr[largest]) {
223 largest = right;
224 }
225
226 if (largest != i) {
227 int swap = arr[i];
228 arr[i] = arr[largest];
229 arr[largest] = swap;
230 heapify(arr, n, largest);
231 }
232 }
233
234 // Counting Sort
235 public static void countingSort(int[] arr) {
236 int n = arr.length;
237 int max = Arrays.stream(arr).max().getAsInt();
238 int min = Arrays.stream(arr).min().getAsInt();
239 int range = max - min + 1;
240 int[] count = new int[range];
241 int[] output = new int[n];
242
243 for (int i = 0; i < n; i++) {
244 count[arr[i] - min]++;
245 }
246
247 for (int i = 1; i < range; i++) {
248 count[i] += count[i - 1];
249 }
250
251 for (int i = n - 1; i >= 0; i--) {
252 output[count[arr[i] - min] - 1] = arr[i];
253 count[arr[i] - min]--;
254 }
255
256 for (int i = 0; i < n; i++) {
257 arr[i] = output[i];
258 }
259 }
260
261 // Radix Sort
262 public static void radixSort(int[] arr) {
263 int max = Arrays.stream(arr).max().getAsInt();
264 for (int exp = 1; max / exp > 0; exp *= 10) {
265 countingSortByDigit(arr, exp);
266 }
267 }
268
269 private static void countingSortByDigit(int[] arr, int exp) {
270 int n = arr.length;
271 int[] output = new int[n];
272 int[] count = new int[10];
273 Arrays.fill(count, 0);
274
275 for (int i = 0; i < n; i++) {
276 count[(arr[i] / exp) % 10]++;
277 }
278
279 for (int i = 1; i < 10; i++) {
280 count[i] += count[i - 1];
281 }
282
283 for (int i = n - 1; i >= 0; i--) {
284 output[count[(arr[i] / exp) % 10] - 1] = arr[i];
285 count[(arr[i] / exp) % 10]--;
286 }
287
288 for (int i = 0; i < n; i++) {
289 arr[i] = output[i];
290 }
291 }
292
293 // Bucket Sort
294 public static void bucketSort(int[] arr) {
295 int n = arr.length;
296 int max = Arrays.stream(arr).max().getAsInt();
297 int min = Arrays.stream(arr).min().getAsInt();
298 int range = max - min + 1;
299
300 int bucketSize = Math.min(range / n, n);
301 int bucketCount = (range + bucketSize - 1) / bucketSize;
302
303 // Create buckets
304 int[][] buckets = new int[bucketCount][];
305 for (int i = 0; i < bucketCount; i++) {
306 buckets[i] = new int[0];
307 }
308
309 // Add elements to buckets
310 for (int i = 0; i < n; i++) {
311 int index = (arr[i] - min) / bucketSize;
312 buckets[index] = append(buckets[index], arr[i]);
313 }
314
315 // Sort individual buckets and merge
316 int index = 0;
317 for (int i = 0; i < bucketCount; i++) {
318 insertionSort(buckets[i]);
319 for (int j = 0; j < buckets[i].length; j++) {
320 arr[index++] = buckets[i][j];
321 }
322 }
323 }
324
325 private static int[] append(int[] arr, int value) {
326 int[] result = Arrays.copyOf(arr, arr.length + 1);
327 result[arr.length] = value;
328 return result;
329 }
330
331 // Shell Sort
332 public static void shellSort(int[] arr) {
333 int n = arr.length;
334 for (int gap = n / 2; gap > 0; gap /= 2) {
335 for (int i = gap; i < n; i++) {
336 int temp = arr[i];
337 int j;
338 for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
339 arr[j] = arr[j - gap];
340 }
341 arr[j] = temp;
342 }
343 }
344 }
345}
346