Skip to content

Latest commit

 

History

History
114 lines (101 loc) · 2.36 KB

File metadata and controls

114 lines (101 loc) · 2.36 KB

//not my code

#include <iostream>
#include<utility>

#include <cstdio>
using namespace std;

int b[] = { 12,10 ,43,43 ,23,123,56,45,123 ,56,56,98,45,123,56,98,41,90,24 ,45 };//,-78,45,
 /**
   * @data  정수 배열
   * @size  data의 정수들의 개수
   * @p  숫자의 최대 자리수
   * @k  기수(10진법을 사용한다면 10)

   */
void rxSort(int* data, int size, int p, int k) 
{
	int* counts, // 특정 자리에서 숫자들의 카운트
		* temp; // 정렬된 배열을 담을 임시 장소
	int index, pval, i, j, n;
	// 메모리 할당
	if ((counts = (int*)malloc(k * sizeof(int))) == NULL)
		return;
	if ((temp = (int*)malloc(size * sizeof(int))) == NULL)
		return;
	for (n = 0; n < p; n++) { // 1의 자리, 10의자리, 100의 자리 순으로 진행
		for (i = 0; i < k; i++)
			counts[i] = 0; // 초기화
		   // 위치값 계산.
		  // n:0 => 1,  1 => 10, 2 => 100
		pval = (int)pow((double)k, (double)n);
		// 각 숫자의 발생횟수를 센다.
		for (j = 0; j < size; j++) 
		{
			// 253이라는 숫자라면
			// n:0 => 3,  1 => 5, 2 => 2
			index = (int)(data[j] / pval) % k;
			counts[index] = counts[index] + 1;
		}
		// 카운트 누적합을 구한다. 계수정렬을 위해서.
		for (i = 1; i < k; i++) 
		{
			counts[i] = counts[i] + counts[i - 1];
		}
		// 카운트를 사용해 각 항목의 위치를 결정한다.
		// 계수정렬 방식
		for (j = size - 1; j >= 0; j--) 
		{ // 뒤에서부터 시작
			index = (int)(data[j] / pval) % k;
			temp[counts[index] - 1] = data[j];
			counts[index] = counts[index] - 1; // 해당 숫자 카운트를 1 감소
		}
		// 임시 데이터 복사
		memcpy(data, temp, size * sizeof(int));
	}
	free(counts);
	free(temp);
}


void COUNTING_SORT(int A[], int n ,int k)//A의 수 n , k : 숫자범위
{
	int* C = new int[k];
	int* B = new int[n];
	for (int i = 0; i < k; i++)
	{
		C[i] = 0;
	}
	for (int j = 0; j < n; j++)
	{
		C[A[j]] = C[A[j]] + 1;
	}
	for (int i = 1; i < k; i++)
	{
		C[i] = C[i] + C[i - 1];
	}

	for (int j = n-1; j >= 0; j--)
	{
		B[C[A[j]]-1] = A[j];
		C[A[j]] = C[A[j]] - 1;
	}

	for (int i = 0; i < n; i++)
	{
		A[i] = B[i];
	}
	delete[] C;
	delete[] B;
}

void print(int A[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << A[i] << ' ';
	}
	cout << '\n';
}

int main()//­
{
	int num = sizeof(b) / sizeof(int);
	print(b, num);

	COUNTING_SORT(b, num, 150);

	print(b, num);
	return 0;
}