所以正如問題所說,我只是想對具有重復值的陣列進行排序。陣列已正確排序,但是當為陣列提供重復值時會出現問題
O/P:不重復
Enter the size of the array : 5 Enter the 5 elements 7 3 4 8 1 After sorting: 1 3 4 7 8 Original array value 7 3 4 8 1
O/P:有重復
5 3 1 1 4 After sorting: 1 3 4 1 3 Original array value 5 3 1 1 4
#include <stdio.h>
void print_sort(int *arr, int size) //function definition
{
int i, j, k, temp, largest = arr[0], smallest = arr[0];
for( i = 1 ; i < size ; i )
{
if(arr[i] > largest)
{
largest = arr[i];
}
if(arr[i] < smallest)
{
smallest = arr[i];
}
}
printf("After sorting: ");
for(i = 0; i < size; i )
{
temp = largest;
printf("%d ", smallest);
for(k = i 1; k < size; k )
{
if(arr[i] == arr[k])
{
smallest = arr[i];
break;
}
for(j = 0; j < size; j )
{
if(arr[j] > smallest && arr[j] < temp)
{
temp = arr[j];
}
}
smallest = temp;
}
}
printf("\n");
printf("Original array value ");
for( i = 0 ; i < size ; i )
{
printf("%d ", arr[i]);
}
}
int main()
{
int size, i;
printf("Enter the size of the array : ");
scanf("%d", &size);
int arr[size];
printf("Enter the %d elements\n",size);
for (i = 0; i < size; i )
{
scanf("%d", &arr[i]);
}
print_sort(arr, size);
}
uj5u.com熱心網友回復:
我知道這是一項特定的練習(家庭作業?),不可能修改陣列而不使用額外的陣列。
這意味著經典的排序演算法無法作業。
迭代搜索最小值是一種可能的解決方案,即使不是有效的 O(n^2)。
為了應對重復,不僅要記住當前的最小值,還要記住它的位置。
這是一種可能的實作方式。
#include <stdio.h>
#include <stdlib.h>
void print_sort(int *arr, int size) //function definition
{
int i, j, k, largest = arr[0], smallest = arr[0];
int i_smallest = 0;
for (i = 1; i < size; i ) {
if (arr[i] > largest) {
largest = arr[i];
}
if(arr[i] < smallest) {
smallest = arr[i];
i_smallest = i;
}
}
printf("After sorting: ");
for (i = 0; i < size; i ) {
int temp = largest 1;
int i_temp = -1;
printf("%d ", smallest);
if (i == size-1) break;
for (k = 0; k < size; k ) {
if (arr[k] < smallest) continue;
if (arr[k] == smallest) {
if (k <= i_smallest) continue;
i_temp = k;
temp = smallest;
break;
}
if (arr[k] < temp) {
temp = arr[k];
i_temp = k;
}
}
smallest = temp;
i_smallest = i_temp;
}
printf("\n");
printf("Original array value ");
for( i = 0 ; i < size ; i )
{
printf("%d ",arr[i]);
}
}
int main(void) {
int size, i;
printf("Enter the size of the array : ");
if (scanf("%d", &size) != 1) exit(1);
int arr[size];
printf("Enter the %d elements\n",size);
for (i = 0; i < size; i ) {
if (scanf("%d", &arr[i]) != 1) exit(1);
}
print_sort(arr, size);
return 0;
}
uj5u.com熱心網友回復:
也許將每個讀取的值直接插入到排序的陣列中會更容易。因此,您不必事后對陣列進行排序。如果您想這樣做,geeksforgeeks.org 也為我已經使用過的 C 提供了很好的示例(https://www.geeksforgeeks.org/search-insert-and-delete-in-a-sorted-array/) .
// C program to implement insert operation in
// an sorted array.
#include <stdio.h>
// Inserts a key in arr[] of given capacity. n is current
// size of arr[]. This function returns n 1 if insertion
// is successful, else n.
int insertSorted(int arr[], int n, int key, int capacity)
{
// Cannot insert more elements if n is already
// more than or equal to capacity
if (n >= capacity)
return n;
int i;
for (i = n - 1; (i >= 0 && arr[i] > key); i--)
arr[i 1] = arr[i];
arr[i 1] = key;
return (n 1);
}
/* Driver program to test above function */
int main()
{
int arr[20] = { 12, 16, 20, 40, 50, 70 };
int capacity = sizeof(arr) / sizeof(arr[0]);
int n = 6;
int i, key = 26;
printf("\nBefore Insertion: ");
for (i = 0; i < n; i )
printf("%d ", arr[i]);
// Inserting key
n = insertSorted(arr, n, key, capacity);
printf("\nAfter Insertion: ");
for (i = 0; i < n; i )
printf("%d ", arr[i]);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/405342.html
標籤:
