void bubble_sort(int list[], int n)
{
int i, j, temp;
for(i = n - 1; i > 0; i --)
{
for(j = 0; j < i; j++)
{
if(list[j]>list[j+1])
{
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
}
void selection_sort(int list[], int n)
{
int i, j, least;
for(i = 0; i < n-1; i++) //마지막 숫자는 자동정렬
{
least = i;
for(j = i + 1; j < n; j++)
{
if(list[j]<list[least])
least = j;
}
if(i != least) //최솟값이 자기 자신이면 이동 X
{
swap(list[i], list[least]);
}
}
}
void insertion_sort(int list[], int n){
int i, j, key;
// 인텍스 0은 이미 정렬된 것으로 볼 수 있다.
for(i=1; i<n; i++){
key = list[i]; // 현재 삽입될 숫자인 i번째 정수를 key 변수로 복사
// 현재 정렬된 배열은 i-1까지이므로 i-1번째부터 역순으로 조사한다.
// j 값은 음수가 아니어야 되고
// key 값보다 정렬된 배열에 있는 값이 크면 j번째를 j+1번째로 이동
for(j=i-1; j>=0 && list[j]>key; j--){
list[j+1] = list[j]; // 레코드의 오른쪽으로 이동
}
list[j+1] = key;
}
}
// gap만큼 떨어진 요소들을 삽입 정렬
// 정렬의 범위는 first에서 last까지
void inc_insertion_sort(int list[], int first, int last, int gap){
int i, j, key;
for(i=first+gap; i<=last; i=i+gap){
key = list[i]; // 현재 삽입될 숫자인 i번째 정수를 key 변수로 복사
// 현재 정렬된 배열은 i-gap까지이므로 i-gap번째부터 역순으로 조사한다.
// j 값은 first 이상이어야 하고
// key 값보다 정렬된 배열에 있는 값이 크면 j번째를 j+gap번째로 이동
for(j=i-gap; j>=first && list[j]>key; j=j-gap){
list[j+gap] = list[j]; // 레코드를 gap만큼 오른쪽으로 이동
}
list[j+gap] = key;
}
}
// 셸 정렬
void shell_sort(int list[], int n){
int i, gap;
for(gap=n/2; gap>0; gap=gap/2){
if((gap%2) == 0)(
gap++; // gap을 홀수로 만든다.
)
// 부분 리스트의 개수는 gap과 같다.
for(i=0; i<gap; i++){
// 부분 리스트에 대한 삽입 정렬 수행
inc_insertion_sort(list, i, n-1, gap);
}
}
}
Divde -> Conquer -> Combine
int partition(int[] list, int left, int right)
{
int pivot, temp;
int low, high;
low = left;
high = right;
pivot = list[left];
while (low < high)
{
while (low <= right && list[low] < pivot)
{
low++;
}
while (high >= left && list[high] > pivot)
{
high--;
}
if (low < high)
{
temp = list[low];
list[low] = list[high];
list[high] = temp;
if (list[low] == list[high])
high--;
}
}
return high;
}
void quickSort(int[] list, int left, int right)
{
if(left < right)
{
int q = partition(list, left, right);
quickSort(list, left, q - 1);
quickSort(list, q + 1, right);
}
}
Divide -> Conquer -> Combine
// i: 정렬된 왼쪽 리스트에 대한 인덱스
// j: 정렬된 오른쪽 리스트에 대한 인덱스
// k: 정렬될 리스트에 대한 인덱스
/* 2개의 인접한 배열 list[left...mid]와 list[mid+1...right]의 합병 과정 */
/* (실제로 숫자들이 정렬되는 과정) */
void merge(int list[], int left, int mid, int right){
int i, j, k, l;
i = left;
j = mid+1;
k = left;
/* 분할 정렬된 list의 합병 */
while(i<=mid && j<=right){
if(list[i]<=list[j])
sorted[k++] = list[i++];
else
sorted[k++] = list[j++];
}
// 남아 있는 값들을 일괄 복사
if(i>mid){
for(l=j; l<=right; l++)
sorted[k++] = list[l];
}
// 남아 있는 값들을 일괄 복사
else{
for(l=i; l<=mid; l++)
sorted[k++] = list[l];
}
// 배열 sorted[](임시 배열)의 리스트를 배열 list[]로 재복사
for(l=left; l<=right; l++){
list[l] = sorted[l];
}
}
// 합병 정렬
void merge_sort(int list[], int left, int right){
int mid;
if(left<right){
mid = (left+right)/2 // 중간 위치를 계산하여 리스트를 균등 분할 -분할(Divide)
merge_sort(list, left, mid); // 앞쪽 부분 리스트 정렬 -정복(Conquer)
merge_sort(list, mid+1, right); // 뒤쪽 부분 리스트 정렬 -정복(Conquer)
merge(list, left, mid, right); // 정렬된 2개의 부분 배열을 합병하는 과정 -결합(Combine)
}
}
static void heapSort(int[] arr) {
int i, temp, length = arr.Length;
for(i=length/2-1; i>=0; i--) heapHeapify(arr, length, i);
for(i=length-1; i>=0; i--) {
temp = arr[0]; arr[0] = arr[i]; arr[i] = temp;
heapHeapify(arr, i, 0);
}
}
static void heapHeapify(int[] arr, int length, int i) {
int left = 2*i + 1, right = 2*i + 2;
int temp, largest = i;
if( left<length && arr[left]>arr[largest]) largest = left;
if( right<length && arr[right]>arr[largest]) largest = right;
if( largest != i ) {
temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp;
heapHeapify(arr, length, largest);
}
}
static int[] CountSort(int[] list, int n)
{
int[] cnt = new int[10001];
int[] ans = new int[10001];
for (int i = 0; i < n; i++) cnt[list[i]]++;
for (int i = 1; i <= 10000; i++) cnt[i] += cnt[i - 1];
for(int i = n-1; i >= 0; i--)
{
int target = list[i];
ans[cnt[target] - 1] = target;
cnt[target]--;
}
return ans;
}
정렬탈트붕괴
Reference
heejeong Kwon
위키백과