例如我有一個陣列 {1,2,2,2,3,3,3,3,4,4,4,4,4,} 我需要將它轉換成 {4,4,4,4,4 ,,3,3,3,3,2,2,2,1} 所以我必須以某種方式按陣列元素的重復次數對其進行排序。我在 C 上看到了這個問題的一些解決方案,但我必須在 C 上撰寫它。我不能使用矢量或 smth。只需使用緩沖區陣列或精確陣列內部進行排序。
我試過這樣的事情,但老實說,現在我陷入了死胡同:它不能像我說的那樣正常作業。我腦子里有一個演算法:
- 程式計算某些元素重復的次數并寫入第二個陣列
- 程式排序第二個陣列
- 程式以某種方式按第二個陣列對第一個陣列進行排序
#include <stdio.h>
int main()
{
const int size = 10;
int A[size], B[size];
int counter1, counter2 = -1;
int temp = 0;
for (int i = 0; i < size; i ) {
printf("Enter %d element of array: ", i 1);
scanf_s("%d", &A[i]);
}
for (int i = 0; i < size-1; i ) {
counter1 = 0;
counter2 ;
for (int j = i; j < size; j ) {
if (A[j] == A[j - 1]) {
break;
}
if (A[j] == A[j 1]) {
counter1 ;
B[counter2] = counter1;
temp = A[i];
}
}
}
for (int i = 0; i < size; i ) {
printf("El %d = %d\n",i 1,B[i]);
}
}
uj5u.com熱心網友回復:
不是最好的,但它可以完成作業!我將最終結果存盤在Result[len][2];變數中!你可以隨意修改代碼
#include <stdio.h>
#include <string.h>
int main( )
{
int array[] = {1,2,2,2,3,3,3,3,4,4,4,4,4,11,10,6,6,6,6,6,6,6,6,6,6,6,6,};
int i,j,k=0,l,len,flag=0,temp0, temp1;
len = sizeof(array)/sizeof(array[0]);
int Result[len][2];
memset(Result,0,sizeof(Result));
for (i = 0 ;i < len ; i )
{
if (k != 0)
{
for (l= 0 ;l < k ; l )
if (array[i]== Result[l][0]) goto skip;
}
for(j= i ; j < len ; j )
{
if (array[i] == array[j])
{
Result[k][0] = array[j];
Result[k][1] ;flag = 1;
}
}
skip: if (flag == 1) {k ; flag = 0;}
}
for (i = 0; i < k; i )
{
for(j= i 1 ; j < k ; j )
{
if(Result[i][1] < Result[j][1])
{
temp0 = Result[i][0];
temp1 = Result[i][1];
Result[i][0] = Result[j][0];
Result[i][1] = Result[j][1];
Result[j][0] = temp0 ;
Result[j][1] = temp1 ;
}
}
}
for (i = 0; i < k; i ) printf("[%d][%d]\n",Result[i][0],Result[i][1]);
return 0;
}
我的電腦在linux環境下輸出如下:
[6][12]
[4][5]
[3][4]
[2][3]
[11][1]
[10][1]
[1][1]
uj5u.com熱心網友回復:
如何按重復次數對陣列進行排序
A按值對大小陣列進行排序m。遍歷陣列并計算不同值的數量:
n分配具有 2 個成員
B[]的大小n為s 的陣列:值和出現次數。struct再次遍歷陣列
A[]并填充B[]排序
B[]方式.occurrence。步行
B[]并重新填充A[]。
O(m) 記憶體,O(m *log m) 時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534161.html
標籤:数组C排序
