정렬
이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다.
가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸고 이를 반복한다.
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(len(array)):
min_idx = i;
for j in range(i+1, len(array)):
if array[min_idx] > array[j]:
min_idx = j
array[i], array[min_idx] = array[min_idx], array[i]
print(array)
데이터를 하나씩 확인하며, 각 데이터를 적절한 위치에 삽입하면 어떨까?
array = [7, 5, 9, 9, 3, 1, 6, 2, 4, 8]
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j]<array[j-i[:
array[j], array[j-1] = array[j-1], array[j]
else:
break;
print(array)
기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸자
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end: # 원소가 1개인 경우
return
pivot = start
left = start + 1
right = end
while left <= right:
while left <= end and array[left] <= array[pivot]
left +=1
while right > start and array[right] >= array[pivot]
if left > array: # 엇갈렸다면 작은 right -= 1 데이터와 피벗을 교체
array[right], array[pivot] = array[pivot], array[right]
else:
array[left], array[right] = array[right], array[left]
quick_sort(array,start, right-1)
quick_sort(Array,right +1, end)
quick_sort(array, 0, len(array)-1)
print(arary)
아래는 직관적이나, 조금 비효율적인 코드이다.
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
if(len(array)==1):
return
pivot = array[0]
tail = array[1:]
left_side = [x for x in tail if x <= pivot]
right_side = [x for x in tail if x> pivot]
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
특정한 조건이 부합할 때만 사용할 수 있지만 매우 빠른 정렬 알고리즘이다.
모든 데이터가 양의 정수이고, 데이터의 수가 N, 최댓값이 K라면 계수 정렬은 최악의 경우에도 수행 시간 를 보장한다. (공간 복잡도 또한 )
# 모든 원소의 값이 0보다 크거나 같다고 가정
array = [7, 5, 9, 1, 4, 7, 2, 5, 3]
# 모든 범위를 포함하는 리스트 (0으로 초기화)
count = [0]*(max(array)+1)
for i in range(len(array)):
count[array[i]] += 1
for j in range(len(count)):
for j in range(count[i]):
print(i, end=' ')
C++에서는 map을 정렬하는 함수가 없다. (기본적으로 Key 기준 정렬으로 알고 있음)
그러므로 성적이 낮은 순서로 출력하기 문제를 풀려면 아래와 같이 해결해야한다.#include <bits/stdc++.h> using namespace std; bool compare(pair<string, int> p1, pair<string, int> p2) { return p1.second < p2.second; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int N; map<string, int> m; cin >> N; for (int i = 0; i < N; i++) { string s; int val; cin >> s >> val; m[s] = val; } vector<pair<string,int>> v(m.begin(),m.end()); sort(v.begin(),v.end(),compare); for (auto p : v) { cout << p.first << " "; } return 0; }
이런 문제를 볼 때마다 파이썬이 참 강력하다 싶다.
성적이 낮은 순서대로 출력하기
n = int(input())
array = []
for i in range(n):
input_data = input().split()
array.append((input_data[0], int(input_data[1])))
array = sorted(array, key=lambda student: student[1])