// 코딩 도장에서 제공한 기본적인 bubble sort를 내가 필요한 방식으로 수정 // 입력으로 배열의 각 행 첫 열의 값과 인덱스를 담은 배열을 받아오고, 배열의 크기를 받아온다. // 배열을 입력으로 받아오는 것이기 때문에, 따로 리턴 값을 지정해줄 필요는 없다. voidbubble_sort_modi(int arrVal[], int arrIdx[], int arrSize){ // 임시 저장 변수 선언 int temp, tempIdx; // 배열의 사이즈 만큼 반복 for(int i = 0; i < arrSize; i++){ // 배열의 사이즈 - 1 만큼 반복 (다음 값을 봐야해서) for(int j = 0; j < arrSize-1; j++){ // 현재 값이 다음 값보다 크면 if(arrVal[j] > arrVal[j+1]){ // 값을 바꿔라 temp = arrVal[j]; arrVal[j] = arrVal[j+1]; arrVal[j+1] = temp; // 그리고 해당하는 인덱스의 위치도 바꿔라 tempIdx = arrIdx[j]; arrIdx[j] = arrIdx[j+1]; arrIdx[j+1] = tempIdx; } } } }
// 입력으로 배열을 받아왔을 때 처리하는 방법과 배열까지 동적으로 선언해서 제공해주는 두 가지의 방법을 작성했다. // 1. 입력으로 정렬할 배열의 주소를 받아올 때 // 2차원 배열의 경우, 고정된 값으로 선언했을 때에는 첫번째 입력에서 볼 수 있는 것처럼 // (자료형) arr[][열 사이즈]와 같이 선언해줘야한다. // 입력으로 넣어주는 2차원 배열이 이중 포인터를 이용한 동적 할당으로 선언된 경우 두번째 입력에서 볼 수 있는 것처럼 // (자료형) **sortedArr 로 선언해주면 된다. // 그리고 행과 열의 사이즈를 입력으로 넣어주면 된다. voidsort2DArr(int arr[][3], int **sortedArr, int row){ // 0으로 초기화된 값, 인덱스를 위한 배열을 선언 int *seq = calloc(row, sizeof(int)); int *seq_idx = calloc(row, sizeof(int)); // 받아온 배열에서 첫 행의 값 꺼내서 넣고, 행의 인덱스 채워넣기 for (int i = 0; i < row; i++){ seq[i] = arr[i][0]; seq_idx[i] = i; }
// 인덱스 정렬하기 bubble_sort_modi(seq,seq_idx,row);
// 정렬된 인덱스에 따라서 정렬한 값을 넣을 배열에 값을 복사해서 넣기 for (int i = 0; i < row; i++){ memcpy(sortedArr[i],arr[seq_idx[i]],sizeof(int)*3); } // 동적 할당한 배열 메모리 해제 free(seq); free(seq_idx); }
// 2. 정렬할 배열을 만들어서 리턴해줄 때 // 동적 할당으로 선언된 배열을 이중포인터로 리턴해주고, 행렬의 사이즈를 잘 알려주면 리턴으로 받아서 이용할 수 있다. int** sort2DArr2(int arr[][3], int row){ // 0으로 초기화된 값, 인덱스를 위한 배열을 선언 int *seq = calloc(row, sizeof(int)); int *seq_idx = calloc(row, sizeof(int)); // 받아온 배열에서 첫 행의 값 꺼내서 넣고, 행의 인덱스 채워넣기 int **sortedArr = calloc(row, sizeof(int *)); for (int i = 0; i < row; i++){ sortedArr[i] = calloc(3, sizeof(int)); }
// 받아온 배열에서 첫 행의 값 꺼내서 넣고, 행의 인덱스 채워넣기 for (int i = 0; i < row; i++){ seq[i] = arr[i][0]; seq_idx[i] = i; } // 인덱스 정렬하기 bubble_sort_modi(seq,seq_idx,row);
// 정렬된 인덱스에 따라서 정렬한 값을 넣을 배열에 값을 복사해서 넣기 for (int i = 0; i < row; i++){ memcpy(sortedArr[i],arr[seq_idx[i]],sizeof(int)*3); } // 동적 할당한 배열 메모리 해제 free(seq); free(seq_idx);
voidbubble_sort_modi(int arrVal[], int arrIdx[], int arrSize); voidsort2DArr(int arr[][3], int **sortedArr, int row); int** sort2DArr2(int arr[][3], int row);
intmain(){
int a[4][3] = { {3,2,2}, {6,7,3}, {4,5,6}, {7,9,2} };
// 1번 방법으로 이용할 경우 int **sortedArr = calloc(4, sizeof(int *)); for (int i = 0; i < 4; i++){ sortedArr[i] = calloc(3, sizeof(int)); }
int seq[4]; int seq_idx[4]; for (int i = 0; i < 4; i++){ seq[i] = a[i][0]; seq_idx[i] = i; }