버블 정렬의 기본 아이디어는 인접한 두 요소를 매번 비교하고 순서가 잘못된 경우 교환하는 것입니다.
상:
버블 정렬 핵심 프로그램
void M_Sort(int arr[], int num) //冒泡 也可以这样写void M_sort(int *arr,int num) 因为数组名就是数组的首地址
{
for (int i = 0; i < num - 1; i++)//n个数排序,只用进行num-1趟
{
for (int j = 0; j < num - i - 1; j++)//从第0位开始比较直到最后一个尚未归位的数,想一想为什么到n-i-1就可以了(如果还想不懂就看下那个动态图)
{
if (arr[j] > arr[j + 1])//这里控制的是排序后的数组是从大到小还是从小到大
{
int Temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = Temp;
}
}
}
}
정렬 선택
간단하고 직관적 인 정렬 알고리즘 인 직접 선택 정렬 (Selection Sort). 먼저 정렬되지 않은 시퀀스에서 가장 작은 (큰) 요소를 찾고 정렬 된 시퀀스의 시작 부분에 저장 한 다음 나머지 정렬되지 않은 시퀀스 요소에서 가장 작은 (큰) 요소를 계속 찾은 다음 정렬 된 시퀀스의 끝에 배치합니다. . 그리고 모든 요소가 정렬 될 때까지 계속됩니다.
그림과 같이 작동
코드 (C ++ 11 표준으로 작성된 VC6.0에서 컴파일되지 않음)
예 :
#include <iostream>
#include <algorithm>
using namespace std;
void SelectSort(int *a, int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = i+1; j < n; j++)
{
if (a[j] < a[i])
{
swap(a[j], a[i]);//swap函数没写是因为algorithm算法库里有这个方法,就没自己写了
}
}
}
}
int main()
{
int a[] = { 2,1,6,9,5,7,3 };
SelectSort(a, 7);
for (auto &s : a)//改成for(int i=0;i<7;i++) cout<<a[i]<<" "; cout<<endl; 在VC6.0上就能编译了
{
cout << s << " ";
}
cout << endl;
system("pause");//在VC6.0上编译的时候把这个去掉,这是VS2015编译时为了防止点击运行时黑色对话框一闪就关掉
return 0;
}
빠른 정렬 효과 다이어그램 :
Quick Sort 나는 Aha Lei의 "Aha Algorithm", 외국 알고리즘 책 "Algorithm Diagram", 그리고 CSDN의 토착 고전 알고리즘 시리즈 6을 읽었습니다. Quick sort CDSN에 대한 간단한 요점을 발췌 한 것 같습니다. CDSN에 대한 빠른 정렬
( http://blog.csdn.net/morewindows/article/details/6684558에서 )
기본 아이디어 : 먼저 참조 번호로 번호 시퀀스에서 번호를 가져옵니다.
2. zoning 과정에서 참조 번호보다 큰 숫자는 모두 오른쪽에 적으십시오 .———————— 파고 채우기 수 + 나누기 정복 방법
기본 숫자보다 작거나 같은 모든 숫자는 왼쪽에 배치됩니다.
삼. 각 간격에 숫자가 하나만있을 때까지 왼쪽 및 오른쪽 간격에 대해 2를 반복합니다.
예를 들어 배열을 사용하고 간격의 첫 번째 숫자를 기본 숫자로 사용하십시오.
0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
72 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 48 | 85 |
처음에는 i = 0, j = 9, X = a [i] = 72
a [0]의 숫자가 X에 저장 되었기 때문에 a [0] 배열에 구멍이 뚫린 것을 알 수 있으며 여기에 다른 데이터를 채울 수 있습니다.
j에서 시작하여 X보다 작거나 X와 같은 숫자를 찾습니다. j = 8이면 조건이 충족되고 a [8]을 파낸 다음 마지막 구덩이 a [0]에 채 웁니다. a [0] = a [8]; i ++; 이런 구덩이 a [0]는 고정되어 있는데 새로운 구덩이 a [8]이 생겼는데 어떻게해야하나요? 간단하게, a [8]의 구덩이를 채울 숫자를 찾으십시오. 이번에는 i에서 시작하여 X보다 큰 숫자를 찾고 i = 3 일 때 조건을 충족하고 a [3]을 파서 마지막 구덩이에 채 웁니다. a [8] = a [3]; j--;
배열은 다음과 같습니다.
0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 88 | 60 | 42 | 83 | 73 | 88 | 85 |
나는 = 3; j = 7; X = 72
위의 단계를 다시 반복하여 먼저 뒤에서 앞을 본 다음 앞에서 뒤를 봅니다.
j = 5 일 때부터 기대하기 시작하고, 조건을 충족하고 a [5]를 파 내고 이전 구덩이에 채우십시오. a [3] = a [5]; i ++;
i에서 시작하여 뒤로 보면 i = 5 일 때 i == j이므로 종료합니다.
이때 i = j = 5이고 a [5]는 지난번에 파낸 구덩이가 되었으니 X를 a [5]에 채워 넣으십시오.
배열은 다음과 같습니다.
0 | 1 | 2 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 |
48 | 6 | 57 | 42 | 60 | 72 | 83 | 73 | 88 | 85 |
a [5] 앞의 숫자는 모두 그보다 작으며 a [5] 뒤의 숫자는 모두 그보다 크다는 것을 알 수 있습니다. 따라서 a [0 ... 4] 및 a [6 ... 9]의 두 하위 구간에 대해 위의 단계를 반복합니다.
파기 및 채움 횟수 요약
1. i = L; j = R; 벤치 마크 번호를 파내어 첫 번째 구덩이 a [i]를 형성합니다.
2. j-- 뒤에서 앞까지보다 작은 숫자를 찾고이 숫자를 찾아서 이전 구멍 a [i]를 찾은 후 채 웁니다.
삼. i ++는 앞에서 뒤로 더 큰 숫자를 검색하고이 숫자를 파내어 이전 피트 a [j]에 채 웁니다.
4. i == j까지 2 단계와 3 단계를 반복하고 a [i]에 참조 번호를 입력합니다.
파기 및 채우기 코드는 다음과 같습니다.
int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置
{
int i = l, j = r;
int x = s[l]; //s[l]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && s[j] >= x)
j--;
if(i < j)
{
s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && s[i] < x)
i++;
if(i < j)
{
s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
return i;
}
분할 및 정복 코드 :
void quick_sort1(int s[], int l, int r)
{
if (l < r)
{
int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[]
quick_sort1(s, l, i - 1); // 递归调用
quick_sort1(s, i + 1, r);
}
}
조합은 다음과 같습니다.
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}