Câu hỏi là sắp xếp mảng theo tần số của các phần tử. Ví dụ, nếu mảng đầu vào làsắp xếp mảng theo thứ tự giảm tần suất xuất hiện của các phần tử trong C
{ 2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12 }
sau đó sửa đổi mảng tới:
{ 3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5 }
tôi đã viết mã cho điều này và nó đang làm việc một cách chính xác, nhưng nó được sử dụng rất nhiều không gian và có độ phức tạp rất cao.
Tôi không hài lòng với giải pháp này và logic mà tôi đã áp dụng cho điều này. Nếu có ai giúp tối ưu hóa mã này hoặc cung cấp logic tốt hơn.
Mã của tôi là:
#define _CRT_SECURE_NO_WARNINGS // this line to work code in visual studio
#include <stdio.h>
int main() {
/*
* n = number of integer
* i = loop variable
* j = inner loop variable
* c = number of distinct input
* buf = temprary storage for input value
* k = possibility of frequency of any no.
*/
int n, i, j, c = 0, buf, k;
int b; //act as flag
int arr[100] = { 0 };
int stack[200] = { 0 };
int top = -1;
printf("Enter the size of array(integer between 1-100):");
scanf("%d", &n);
n *= 2;
printf("----------Enter the elements in the array----------\n\n");
for (i = 0; i < n; i += 2) {
b = 0;
printf("Enter the element:");
scanf("%d", &buf);
for (j = 0; j <= i; j += 2) {
if (arr[j] == buf) {
arr[j + 1]++;
b = 1;
}
}
if (b == 0) {
c++;
arr[c * 2 - 2] = buf;
arr[c * 2 - 1]++;
}
}
for (i = 0; i < c * 2; i++)
printf("%d ", arr[i]);
//input done in form of (element,times of occurence i.e. frequency),to print array, write this outside of comment:
//for (i = 0; i < c * 2; i++) printf("%d ", arr[i]);
for (k = 1; k < n/2; k++) { //checking for possible frequencies
for (j = c * 2 - 1; j > 0; j -= 2) {
//locations(index) to check in array for frequency
//left to right, so with same frequency no.,which occurred first will push in last.
if (arr[j] == k)
stack[++top] = j; //pushing(index of frequency) into stack in increasing order of frequency
}
}
//to print stack, write this outside of comment:
//printf("\nstack\n");
//for (i = top; i > -1; i--) printf("%d ",stack[i]);
//printing of elements in there decreasing order of frequency(pop from stack)
//we have to print element, number of times of its frequency
printf("\n\n----------Output array in sorted order of there frequency----------\n");
for (top; top > -1; top--) {
for (j = arr[stack[top]]; j > 0; j--)
printf("%d ", arr[stack[top] - 1]);
}
}
Bạn có bị giới hạn chỉ 'C' không? Nếu 'C++' được cho phép, nơi bạn có thể sử dụng' std :: map' và 'qsort', bạn có thể làm điều đó trong 15 dòng mã – mvp
Đọc: [Sắp xếp các yếu tố theo tần số | Set 2] (http://www.geeksforgeeks.org/sort-elements-by-frequency-set-2/) –
có bởi vì tôi không biết C++ ở tất cả ... nhưng bạn có thể sugest với C++ cho những người khác .. bt tôi sẽ chắc chắn không thể hiểu rằng .. –