๋ถ๋ฅ | ์๊ณ ๋ฆฌ์ฆ |
---|---|
๋จ์ํ์ง๋ง ๋๋ฆผ O(nยฒ) |
๊ฑฐํ ์ ๋ ฌ(Bubble Sort) |
์ฝ์ ์ ๋ ฌ(Insertion) Sort) | |
์ ํ ์ ๋ ฌ(Selection Sort) | |
๋ณต์กํ์ง๋ง ๋น ๋ฆ O(n log n) |
ํต ์ ๋ ฌ(Quick Sort) |
ํฉ๋ณ ์ ๋ ฌ(Merge Sort) | |
ํ ์ ๋ ฌ(Heap Sort) | |
ํ๊ท O(n) |
๋ผ๋์ค ์ ๋ ฌ(Radix Sort) |
- Arrays ํด๋์ค๋ primitive ํ์
๋ฐ์ดํฐ๋ฅผ ์ํ ์ ๋ ฌ ๋ฉ์๋ ์ ๊ณต
// ์ ๋ ฌํ ๋ฐ์ดํฐ int[] data = new int[capacity]; // data[0]์์ data[capacity-1]๊น์ง ๋ฐ์ดํฐ๊ฐ ๊ฝ ์ฐจ ์๋ ๊ฒฝ์ฐ Arrays.sort(data); // data[0]์์ data[size-1]๊น์ง size๊ฐ์ ๋ฐ์ดํฐ๋ง ์๋ ๊ฒฝ์ฐ Arrays.sort(data, 0, size);
- int ์ด์ธ์ ๋ค๋ฅธ primitive ํ์ ๋ฐ์ดํฐ(double, char)์ ๋ํด์๋ ์ ๊ณต
- primitive ํ์
๋ฐ์ดํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก Arrays.sort ๋ฉ์๋๋ก ์ ๋ ฌ
// ์ ๋ ฌํ ๋ฐ์ดํฐ String[] fruits = new String[] {"pineapple", "apple", "orange", "banana"}; Arrays.sort(fruits); for(String name : fruits) System.out.println(name);
- Collections.sort ๋ฉ์๋๋ก ์ ๋ ฌ
// ์ ๋ ฌํ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณต๊ฐ List<String> fruits = new ArrayList<String>(); // ์ ๋ ฌํ ๋ฐ์ดํฐ fruits.add("Pineapple"); fruits.add("Apple"); fruits.add("Orange"); fruits.add("Banana"); Collections.sort(fruits); for(String name: fruits) System.out.println(name);
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ
public class Fruit
{
public String name;
public int quantity;
public Fruit(String name, int quantity)
{
this.name = name;
this.quantity = quantity;
}
}
//====================================================//
// ์คํ ํ
์คํธ ํด๋์ค
public class test()
{
public static void main(String[] args)
{
Fruit[] fruits = new Fruit[4];
fruits[0] = new Fruit("Pineapple", 70);
fruits[1] = new Fruit("Apple", 100);
fruits[2] = new Fruit("Orange", 80);
fruits[3] = new Fruit("Banana", 90);
Arrays.sort(fruits);
}
}
-
์ด๋ฆ์ ์ ๋ ฌ
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ public class Fruit implements Comparable<Fruit> { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } @Override public int compareTo(Fruit o) { return name.compareTo(o.name); } } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค, ์์ ๋์ผํ๋ฏ๋ก ์๋ต
-
์ฌ๊ณ ์๋๋ณ ์ ๋ ฌ
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ public class Fruit implements Comparable<Fruit> { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } @Override public int compareTo(Fruit o) { return quantity - o.quantity; } } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค, ์์ ๋์ผํ๋ฏ๋ก ์๋ต
1. Comparator ํด๋์ค extends
2. compare ๋ฉ์๋๋ฅผ Overrideํ๋ ์๋ก์ด ์ด๋ฆ ์๋ ํด๋์ค๋ฅผ ์ ์
3. ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ ๋ค๋ฉด Comparator ๊ฐ์ฒด๋ค์ ์ด๋์ ๋ ๊ฒ์ธ๊ฐ?
: ๋ฐ์ดํฐ ๊ฐ์ฒด์ static member๋ก ๋๋ค.
: ์ ๋ ฌ ์ Arrays.sort(fruits, Fruit.xxxComparator); ๋ก ์ฌ์ฉํ๋ค.
- Comparator์ ์ฌ์ฉ
public class Fruit { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } // Comparator์ ์ต๋ช ํด๋์ค ์ ์ ํ compare ๋ฉ์๋ ์ฌ์ ์(์ด๋ฆ์) public static Comparator<Fruit> nameComparator = new Comparator<Fruit>() { @Override public int compare(Fruit o1, Fruit o2) { return o1.name.compareTo(o1.name); } }; // Comparator์ ์ต๋ช ํด๋์ค ์ ์ ํ compare ๋ฉ์๋ ์ฌ์ ์(์ฌ๊ณ ์๋๋ณ) public static Comparator<Fruit> quantityComparator = new Comparator<Fruit>() { @Override public int compare(Fruit o1, Fruit o2) { return o1.quantity - o2.quantity; } }; } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค public class test() { public static void main(String[] args) { Fruit[] fruits = new Fruit[4]; fruits[0] = new Fruit("Pineapple", 70); fruits[1] = new Fruit("Apple", 100); fruits[2] = new Fruit("Orange", 80); fruits[3] = new Fruit("Banana", 90); Arrays.sort(fruits, nameComparator); // OR Arrays.sort(fruits, quantityComparator); } }
- Array ํด๋์ค๋ primitive ํ์
๋ฐ์ดํฐ๋ฅผ ์ํ ์ ๋ ฌ ๋ฉ์๋ ์ ๊ณต
// ์ ๋ ฌํ ๋ฐ์ดํฐ int[] data = new int[capacity]; // data[0]์์ data[capacity-1]๊น์ง ๋ฐ์ดํฐ๊ฐ ๊ฝ ์ฐจ ์๋ ๊ฒฝ์ฐ Array.Sort(data); // data[0]์์ data[size-1]๊น์ง size๊ฐ์ ๋ฐ์ดํฐ๋ง ์๋ ๊ฒฝ์ฐ Array.Sort(data, 0, size);
- int ์ด์ธ์ ๋ค๋ฅธ primitive ํ์ ๋ฐ์ดํฐ(double, char)์ ๋ํด์๋ ์ ๊ณต
- primitive ํ์
๋ฐ์ดํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก Array.Sort ๋ฉ์๋๋ก ์ ๋ ฌ
// ์ ๋ ฌํ ๋ฐ์ดํฐ String[] fruits = new String[] {"pineapple", "apple", "orange", "banana"}; Array.Sort(fruits); foreach(String name in fruits) Console.WriteLine(name);
- Sort() ๋ฉ์๋๋ก ์ ๋ ฌ
// ์ ๋ ฌํ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณต๊ฐ ArrayList fruits = new ArrayList(); // ์ ๋ ฌํ ๋ฐ์ดํฐ fruits.Add("Pineapple"); fruits.Add("Apple"); fruits.Add("Orange"); fruits.Add("Banana"); fruits.Sort(); foreach(String name in fruits) Console.WriteLine(name);
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ
public class Fruit
{
public String name;
public int quantity;
public Fruit(String name, int quantity)
{
this.name = name;
this.quantity = quantity;
}
}
//====================================================//
// ์คํ ํ
์คํธ ํด๋์ค
public class test()
{
public static void Main(string[] args)
{
Fruit[] fruits = new Fruit[4];
fruits[0] = new Fruit("Pineapple", 70);
fruits[1] = new Fruit("Apple", 100);
fruits[2] = new Fruit("Orange", 80);
fruits[3] = new Fruit("Banana", 90);
Array.Sort(fruits);
foreach (Fruit member in fruits)
{
Console.WriteLine(member);
}
}
}
-
์ด๋ฆ์ ์ ๋ ฌ
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ, IComparable ๊ตฌํ public class Fruit : IComparable<_Fruit> { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } // ์ ๋ ฌ์ ์ํ ๊ฐ์ฒด ๊ตฌํ public int CompareTo(_Fruit o) { return name.CompareTo(o.name); } } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค, ์์ ๋์ผํ๋ฏ๋ก ์๋ต
-
์ฌ๊ณ ์๋๋ณ ์ ๋ ฌ
// ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด ์์ฑ, IComparable ๊ตฌํ public class Fruit : IComparable<_Fruit> { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } // ์ ๋ ฌ์ ์ํ ๊ฐ์ฒด ๊ตฌํ public int CompareTo(_Fruit o1, _Fruit o2) { return o1.quantity - o2.quantity; } } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค, ์์ ๋์ผํ๋ฏ๋ก ์๋ต
1. Comparer ํด๋์ค extends
2. Compare ๋ฉ์๋๋ฅผ override ํ๋ ์๋ก์ด ์ด๋ฆ ์๋ ํด๋์ค๋ฅผ ์ ์
3. ํด๋น ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ ๋ค๋ฉด Comparer ๊ฐ์ฒด๋ค์ ์ด๋์ ๋ ๊ฒ์ธ๊ฐ?
: ๋ฐ์ดํฐ ๊ฐ์ฒด์ member๋ก ๋๋ค.
: ์ ๋ ฌ ์ Array.sort(fruits, new xxxComparer()); ๋ก ์ฌ์ฉํ๋ค.
- Comparer์ ์ฌ์ฉ
public class Fruit { public String name; public int quantity; public Fruit(String name, int quantity) { this.name = name; this.quantity = quantity; } // Comparer์ ์ต๋ช ํด๋์ค ์ ์ ํ Compare ๋ฉ์๋ ์ฌ์ ์(์ด๋ฆ์) public class nameComparer : Comparer<Fruit> { public override int Compare(Fruit o1, Fruit o2) { return String.Compare(o1.name, o2.name); } } // Comparer์ ์ต๋ช ํด๋์ค ์ ์ ํ Compare ๋ฉ์๋ ์ฌ์ ์(์ฌ๊ณ ์๋๋ณ) public class quantityComparer : Comparer<Fruit> { public override int Compare(Fruit o1, Fruit o2) { return o1.quantity - o2.quantity; } } } //====================================================// // ์คํ ํ ์คํธ ํด๋์ค public class test() { public static void Main(string[] args) { Fruit[] fruits = new Fruit[4]; fruits[0] = new Fruit("Pineapple", 70); fruits[1] = new Fruit("Apple", 100); fruits[2] = new Fruit("Orange", 80); fruits[3] = new Fruit("Banana", 90); Array.Sort(fruits, new nameComparer()); // OR Array.Sort(fruits, new quantityComparer()); foreach (Fruit member in fruits) { Console.WriteLine(member); } } }
-
๊ฐ ๋ฃจํ ์ ํ๋
- ์ธ์ ํ ์์๋ฅผ ๋น๊ตํ์ฌ ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํจ๋ค.
- ๋ค์ ํ์ฐจ ๋ฃจํ๋ ๋งจ ์ผ์ชฝ ์์๋ฅผ ์ ์ธํ๋ค.
-
๋ฃจํ์ ์์์ด ๋งจ ์ค๋ฅธ์ชฝ์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
// ๋ฐฉ๋ฒ 1
public static void bubbleSort(int[] n)
{
// ์์๋ก ์ ์ฅํ ๋ณ์ ์ ์ธ
int temp = 0;
// ์ ๋ ฌ์ด ํ์ํ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๋ฃจํ
for (int i = 0; i < n.length; i++)
{
// ์ํํ๋ฉด์ ๋น๊ตํ ์ค์ ๋ฃจํ
for (int j = i + 1; j < n.length; j++)
{
// ์ ์์์ ๊ฐ์ด ํฌ๋ฉด
if (n[i] > n[j])
{
// ์์ ๋ณ์์ ์์ ์์์ ๊ฐ์ ์ ์ฅํ๊ณ
temp = n[j];
// ์์ ์์์ ์์น์ ํฐ ์์์ ๊ฐ์ ์ ์ฅํ๊ณ
n[j] = n[i];
// ํฐ ์์์ ์์น์ ์์ ๋ณ์์ ๊ฐ์ ์ ์ฅ
n[i] = temp;
}
}
}
}
// ๋ฐฉ๋ฒ 2
public static void bubbleSort2(int[] n)
{
// flag ๋ณ์
boolean switched;
do
{
// ๋ฐ๋ณต๋ฌธ์ ๋๋ผ ์ ์๊ฒ false๋ก ๋ณํ
switched = false;
// ์ ๋ ฌ์ด ํ์ํ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๋ฃจํ
for (int i = 0; i < n.length - 1; i++)
{
if (n[i + 1] < n[i])
{
// ์์ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด์ ์์ ์์ ๊ฐ์ ์ ์ฅํ๊ณ
int tmp = n[i + 1];
// ์์ ์์์ ์์น์ ํฐ ์์์ ๊ฐ์ ์ ์ฅํ๊ณ
n[i + 1] = n[i];
// ํฐ ์์์ ์์น์ ์์ ๋ณ์์ ๊ฐ์ ์ ์ฅ
n[i] = tmp;
// ๊ตํ์ด ๋์์ผ๋ฏ๋ก flag๋ฅผ true๋ก ๋ณํํ์ฌ ๋ฃจํ ๋ฐ๋ณต
switched = true;
}
}
// ๊ตํ์ด ์์ ๋๊น์ง ๋ฐ๋ณต
} while (switched);
}
-
๊ฐ ๋ฃจํ ์ ํ๋
- ์์ํ์ฐจ + 1์ ์์น ์์๋ฅผ ์ ๋ ฌ๋ ๋ฐฐ์ด๊ณผ ๋น๊ตํ๋ค.
- ์์ ์ ์์น๋ฅผ ์ฐพ์ ์ฝ์ ํ๋ค.
-
๋ฃจํ์ ์์์ด ๋งจ ์ค๋ฅธ์ชฝ์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
public static void insertionSort(int[] n)
{
// ์ ๋ ฌ์ด ํ์ํ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๋ฃจํ, 2๋ฒ์งธ ์์๋ถํฐ ์์ํ๋ฏ๋ก i ๋ 1๋ก ์ด๊ธฐํ
for (int i = 1; i < n.length; i++)
{
// ๋ฃจํํ๋ฉฐ ๋น๊ตํ ์์
int key = n[i];
// ๋น๊ต ๋์์ด ๋๋ i ๋ณด๋ค ์์ ์๋ ์์์ ์์น
int j = i - 1;
// j ๊ฐ 0๋ณด๋ค ์์์ง ๋๊น์ง ๋ฐ๋ณต
while (j >= 0)
{
// ๋น๊ตํ ์์ ๊ฐ๋ณด๋ค ๋น๊ต ๋์์ ๊ฐ์ด ํฌ๋ฉด
if(n[j] > key)
{
// ๋น๊ต ๋์์ ๊ฐ์ key์ n[j] ์ฌ์ด์ ์ฝ์
n[j + 1] = n[j];
// j ๊ฐ์
j--;
}
}
// ๋ฃจํ๊ฐ ๋๋๋ฉด key ๊ฐ์ ์ฝ์
n[j + 1] = key;
}
}
-
๊ฐ ๋ฃจํ ์ ํ๋
- ๋ฃจํ์ ์ต๋ ์์๋ฅผ ์ฐพ๋๋ค.
- ์ต๋ ์์์ ๋งจ ์ค๋ฅธ์ชฝ ์์๋ฅผ ๊ตํํ๋ค.
- ๋งจ ์ค๋ฅธ์ชฝ ์์๋ฅผ ์ ์ธํ๋ค.
-
ํ๋์ ์์๋ง ๋จ์ ๋๊น์ง ์์ ๋ฃจํ๋ฅผ ๋ฐ๋ณตํ๋ค.
public static void selectionSort(int[] n)
{
// ์์๋ก ์ ์ฅํ ๋ณ์ ์ ์ธ
int temp = 0;
// ์ ๋ ฌ์ด ํ์ํ ๋ฐฐ์ด์ ๊ธธ์ด๋งํผ ๋ฃจํ
for (int i = 0; i < n.length; i++)
{
// ์ต์๊ฐ์ ์์น๋ฅผ ์ ์ฅํ ๋ณ์
int min = i;
// ๋ฐฐ์ด์ ๋์์๋ถํฐ i ์์น๊น์ง ๋น๊ตํ ๋ฃจํ
for (int j = n.length - 1; j > i; j--)
{
// ๋น๊ตํ๋ ๊ฐ์ด ์ต์๊ฐ๋ณด๋ค ์์ผ๋ฉด
if (n[j] < n[min])
// ์๋ก์ ์์น ๊ฐ์ ๋ณ๊ฒฝ
min = j;
}
// ์์ ๋ณ์์ ํ์ฌ ๊ฐ ์ ์ฅ
temp = n[i];
// i์ ์์ ๊ฐ์ ์ต์๊ฐ์ด ๋์ด์ผ ํ๋ฏ๋ก ๊ตํ
n[i] = n[min];
// ์ต์๊ฐ์ด์๋ ์์์ ์์ ๋ณ์์ ๊ฐ์ ์ ์ฅ
n[min] = temp;
}
}
-
์์์ pivot ๊ฐ์ ์ง์ ํ๋ค.
-
๊ฐ ๋ฃจํ ์ ํ๋
- pivot ๋ณด๋ค ํฐ ๊ฐ์ pivot index ๋ณด๋ค ์ผ์ชฝ์์ ์ฐพ์ ํฐ ๊ฐ์ด ๋ํ๋ ๋๊น์ง i(index)๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
- pivot ๋ณด๋ค ์์ ๊ฐ์ pivot index ๋ณด๋ค ์ค๋ฅธ์ชฝ์์ ์ฐพ์ ์์ ๊ฐ์ด ๋ํ๋ ๋๊น์ง j(index)๋ฅผ ๊ฐ์์ํจ๋ค.
- pivot ์ ๊ธฐ์ค์ผ๋ก ๊ฐ ๋น๊ต๊ฐ ์๋ฃ๋์๋ค๋ฉด index ๊ฒฐ๊ณผ i , j ๋ฅผ ๋น๊ตํ๋ค.
- i ๊ฐ์ด j ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด pivot ์ ๊ธฐ์ค์ผ๋ก ๊ตํ์ ํด์ผ ํ ๊ฐ์ด ์กด์ฌํ๋ค๋ ๋ป์ด๋ค.
- ๊ฐ์ ๊ตํํ ๋ค i ๋ ์ฆ๊ฐ, j ๋ ๊ฐ์์ํจ๋ค.
-
i ๊ฐ j ๋ณด๋ค ํด ๋๊น์ง ๋ฐ๋ณตํ๋ค.
// ํต ์ ๋ ฌ : ๋ฆฌ์คํธ ํํ
public static List<Integer> quickSort(List<Integer> n)
{
// ์ฌ๊ท๋ฅผ ๋๋ผ ์กฐ๊ฑด, ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 1์ดํ๋ผ๋ฉด ์ ๋ ฌํ ํ์๊ฐ ์์
if (n.size() < 2)
return n;
// ์์์ ๊ธฐ์ค ์ ์
int pivot = n.get(0);
// ํผ๋ด์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ ์์นํ ๋ฆฌ์คํธ
List<Integer> lower = new ArrayList<Integer>();
// ํผ๋ด์ ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ์ ์์นํ ๋ฆฌ์คํธ
List<Integer> higher = new ArrayList<Integer>();
// ์ ๋ ฌ์ด ํ์ํ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๋งํผ ๋ฃจํ, ํผ๋ด์ 0์ผ๋ก ์ก์์ผ๋ i ๋ 1๋ถํฐ ์์
for (int i = 1; i < n.size(); i++)
{
// ํผ๋ด๋ณด๋ค ํ์ฌ์ ๊ฐ์ด ์์ผ๋ฉด
if (pivot > n.get(i))
// ์ผ์ชฝ์ ์ถ๊ฐ
lower.add(n.get(i));
else
// ์๋๋ผ๋ฉด ์ค๋ฅธ์ชฝ์ ์ถ๊ฐ
higher.add(n.get(i));
}
// ์ผ์ชฝ์ ์์นํ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ทํ์ฌ ์ ๋ ฌ๋ ํํ๋ก ๊ตฌํ
List<Integer> answer = quickSort(lower);
// ํผ๋ด์ ๊ฐ์ ์ค๊ฐ์ ์์นํด์ผํจ
answer.add(pivot);
// ๋๋จธ์ง์ ๊ฐ์ ์ค๋ฅธ์ชฝ์ ์์นํ๋ฏ๋ก ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ํฉ์นจ
answer.addAll(quickSort(higher));
// ํฉ์น ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
return answer;
}
// ํต ์ ๋ ฌ : ๋ฐฐ์ด ํํ
public static void quickSort(int n[], int lower, int higher)
{
// lower์ ๊ฐ์ด higher์ ํฌ๊ธฐ๋ณด๋ค ํฌ๋ค๋ฉด
if (lower < higher)
{
// ํผ๋ด์ ๋ฐฐ์ด์ ๋ถํ ํ์ฌ ๋ฐํ๋ ๊ฐ์ผ๋ก ์ ์ธ
int pivot = partition(n, lower, higher);
// ์ผ์ชฝ์ ์์นํ๋ ๋ฐฐ์ด์ ์ฌ๊ทํ์ฌ ์ ๋ ฌ
quickSort(n, lower, pivot - 1);
// ์ค๋ฅธ์ชฝ์ ์์นํ๋ ๋ฐฐ์ด์ ์ฌ๊ทํ์ฌ ์ ๋ ฌ
quickSort(n, pivot + 1, higher);
}
}
// ํต ์ ๋ ฌ : ์ฌ๊ทํธ์ถ(๋ถํ )
public static int partition(int[] n, int lower, int higher)
{
// ํผ๋ด์ ๊ฐ์ ๋ฐฐ์ด์ ์ค์
int pivot = n[(lower + higher) / 2];
// ์ผ์ชฝ ๊ธฐ์ค ๊ฐ์ด ์ค๋ฅธ์ชฝ ๊ธฐ์ค ๊ฐ๋ณด๋ค ์์ ๋๊น์ง ๋ฐ๋ณต
while (lower < higher)
{
// ํผ๋ด๋ณด๋ค ์ผ์ชฝ์ ์์๊ฐ ์๋ค๋ฉด lower๋ฅผ ์ฆ๊ฐ
while ((n[lower] < pivot) && (lower < higher))
lower++;
// ํผ๋ด๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์์๊ฐ ํฌ๋ค๋ฉด higher๋ฅผ ๊ฐ์
while ((n[higher] > pivot) && (lower < higher))
higher--;
if (lower < higher)
{
// ๊ตํ
int temp = n[lower];
n[lower] = n[higher];
n[higher] = temp;
}
}
// while๋ฌธ์ด ๋๋๋ ์์ ์ lower๊ฐ higher์ ๊ฐ์์ง ๋
return lower;
}
-
ํด๊ฒฐํ๊ธฐ ํ๋ ์ฃผ ๋ฌธ์ ๋ฅผ ๋ถ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
-
๋ณดํต ์ฌ๊ท ํจ์(Recursive Function)๋ก ๊ตฌํ
- ๋ถ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ์์๋ก ์ ํ ๊ฐ๋ฅ
- ์ฌ๊ท ํธ์ถ์ ์ฌ์ฉํ ํจ์๋ ํจ์ ํธ์ถ ์ค๋ฒํค๋ ๋๋ฌธ์ ์คํ ์๋ ๊ฐ์
- ๋น ๋ฅธ ์คํ์ด๋ ๋ถ ๋ฌธ์ ํด๊ฒฐ ์์ ์ ํ์ ์ํด ์ฌ๊ท ํธ์ถ์ด ์๋ ์คํ(Stack), ํ(Queue) ๋ฑ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๋ถํ ์ ๋ณต๋ฒ์ ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅ
-
์์ฌ์ฝ๋ ํํ
function F(x): if F(x)์ ๋ฌธ์ ๊ฐ ๊ฐ๋จ then: return F(x)์ ์ง์ ๊ณ์ฐํ ๊ฐ else: x ๋ฅผ y1, y2๋ก ๋ถํ F(y1)๊ณผ F(y2)๋ฅผ ํธ์ถ return F(y1), F(y2)๋ก๋ถํฐ F(x)๋ฅผ ๊ตฌํ ๊ฐ
- ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 1 ์ดํ์ด๋ฉด ์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒ์ผ๋ก ๋ณธ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋
- ๋ถํ (divide) : ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฐ์ผ๋ก ์๋ผ ๋น์ทํ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๋ค.
- ์ ๋ณต(conquer) : ๊ฐ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ๋ณ ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌํ๋ค.
- ๊ฒฐํฉ(combine) : ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ก ํฉ๋ณํ๋ค. ์ด๋ ์ ๋ ฌ ๊ฒฐ๊ณผ๊ฐ ์์๋ฐฐ์ด์ ์ ์ฅ๋๋ค.
- ๋ณต์ฌ(copy) : ์์ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ค.
// ๋ณํฉ ์ ๋ ฌ ํธ์ถ
public static void mergeSort(int[] arr)
{
// ์ ๋ ฌ์ ์ฌ์ฉํ ๋์ผํ ๊ธธ์ด์ ๋ฐฐ์ด ์ ์ธ
int[] temp = new int[arr.length];
// ์ฌ๊ทํจ์ ํธ์ถ
mergeSort(arr, temp, 0, arr.length - 1);
}
// ๋ณํฉ ์ ๋ ฌ ์์
public static void mergeSort(int[] arr, int[] temp, int start, int end)
{
// ์์ ์์น ๊ฐ์ด ์ข
๋ฃ ์์น ๊ฐ๋ณด๋ค ์์ ๋๊น์ง
if (start < end)
{
// ์ค์๊ฐ ๋ณ์ ์ ์ธ
int mid = (start + end) / 2;
// ์ฒ์๋ถํฐ ์ค์๊ฐ๊น์ง์ ์์๋ฅผ ์ฌ๊ทํ์ฌ ์ ๋ ฌ
mergeSort(arr, temp, start, mid);
// ์ค์๊ฐ ์ดํ๋ถํฐ ๋๊น์ง์ ์์๋ฅผ ์ฌ๊ทํ์ฌ ์ ๋ ฌ
mergeSort(arr, temp, mid + 1, end);
// ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ณํฉ
merge(arr, temp, start, mid, end);
}
}
// ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ ์คํ
public static void merge(int[] arr, int[] temp, int start, int mid, int end)
{
// ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ณต์ฌ
// java ์ ๊ฒฝ์ฐ Arrays.copyOf ์ฐ๋ฉด ๋จ
for (int i = start; i <= end; i++)
{
temp[i] = arr[i];
}
// ์ผ์ชฝ์ ์์ ์์น ๊ฐ ์ ์ฅ
int part1 = start;
// ์ค๋ฅธ์ชฝ์ ์์ ์์น ๊ฐ ์ ์ฅ
int part2 = mid + 1;
// ์ ๋ ์์น ๊ฐ ์ ์ฅ
int index = start;
// ์ผ์ชฝ ์์ ์์น ๊ฐ์ด ์ค์์ ๋ค๋ค๋ฅด๊ฑฐ๋ ์ค๋ฅธ์ชฝ ์์ ์์น ๊ฐ์ด ๋์ ๋ค๋ค๋ฅผ ๋๊น์ง
while (part1 <= mid && part2 <= end)
{
// ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์์ ๊ฐ์ ๋น๊ต
if (temp[part1] <= temp[part2])
{
// ์ผ์ชฝ์ด ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ค์ ๋ฐฐ์ด์ ์ ๋ ์์น์ ๊ฐ์ ์ ์ฅํ๊ณ
arr[index] = temp[part1];
// ์ผ์ชฝ ์์ ์์น ๊ฐ์ ์ฆ๊ฐ
part1++;
}
// ์๋๋ผ๋ฉด
else
{
// ์ค์ ๋ฐฐ์ด์ ์ ๋ ์์น์ ์ค๋ฅธ์ชฝ ์์ ๊ฐ์ ์ ์ฅํ๊ณ
arr[index] = temp[part2];
// ์ค๋ฅธ์ชฝ ์์ ์์น ๊ฐ์ ์ฆ๊ฐ
part2++;
}
// ๋ฃจํ๊ฐ ๋ ๋๋ง๋ค ์ ๋ ์์น๊ฐ์ ์ฆ๊ฐ
index++;
}
// part1์ while ๋ฃจํ๊ฐ ๋๋ ์์ ์ด๋ฏ๋ก mid์ ๊ฐ๊ฑฐ๋ ์์ ๊ฐ์
for (int i = 0; i <= mid - part1; i++)
{
// ์ค์ ๋ฐฐ์ด์ ์ ๋ ์์น์ i ๊ฐ์ ๋ํ ์์น๋ ์ค์๊ณผ ๊ฐ์
// ๊ฐ์ ์ฎ๊ฒจ ๋ด์์ ์ ์ฅ
arr[index + i] = temp[part1 + i];
}
}
- n๊ฐ์ ๋ ธ๋์ ๋ํ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ค. ์ด๋ ๋ฃจํธ ๋ ธ๋๋ถํฐ ๋ถ๋ชจ๋ ธ๋, ์ผ์ชฝ ์์๋ ธ๋, ์ค๋ฅธ์ชฝ ์์๋ ธ๋ ์์ผ๋ก ๊ตฌ์ฑํ๋ค.
- ์ต๋ ํ์ ๊ตฌ์ฑํ๋ค. ์ต๋ ํ์ด๋ ๋ถ๋ชจ๋ ธ๋๊ฐ ์์๋ ธ๋๋ณด๋ค ํฐ ํธ๋ฆฌ๋ฅผ ๋งํ๋๋ฐ, ๋จ๋ง ๋ ธ๋๋ฅผ ์์๋ ธ๋๋ก ๊ฐ์ง ๋ถ๋ชจ๋ ธ๋๋ถํฐ ๊ตฌ์ฑํ๋ฉฐ ์๋๋ถํฐ ๋ฃจํธ๊น์ง ์ฌ๋ผ์ค๋ฉฐ ์์ฐจ์ ์ผ๋ก ๋ง๋ค์ด ๊ฐ ์ ์๋ค.
- ๊ฐ์ฅ ํฐ ์(๋ฃจํธ์ ์์น)๋ฅผ ๊ฐ์ฅ ์์ ์์ ๊ตํํ๋ค.
- 2์ 3์ ๋ฐ๋ณตํ๋ค.
- 1, 2์ฃผ์ฐจ ๋ฌธ์ ๋ฅผ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ๋ผ.
- ์ข ๋ ํจ์จ์ ์ธ ์๋จ์ ์ฌ์ฉํ์ฌ ์๊ฐ์ ๋จ์ถํ๋ผ.