Tri rapide ( O(N*logN) )
Il est plus efficace dans la même complexité temporelle que ON*log(N).
L'idée de base est la suivante :
1. Prenez d'abord un nombre de la séquence comme nombre de base.
2. Dans le processus de partitionnement, tous les nombres supérieurs à ce nombre sont placés sur le côté droit de celui-ci, et tous les nombres inférieurs ou égaux sont placés sur le côté gauche de celui-ci.
3. Répétez ensuite la deuxième étape pour les intervalles de gauche et de droite jusqu'à ce que chaque intervalle n'ait qu'un seul numéro.
#include<bits/stdc++.h>
using namespace std;
//对于数组的传参,可以按照int arr[],也可以int *arr,这两种方法都是传入的地址,
//因此在函数中对数组的操作,会改变原有数组的值,
void quick_sort(int arr[],int begin,int end){
if ( begin<end) {
//挖走begin位置的数,这个位置的数会有别的数来填补
int i = begin, j = end, x = arr[begin];
//倒叙找到第一个小于x的数然后填入begin的坑
//这个时候j的位置就出现了一个新的坑,这个位置需要一个比基数大的数填
while (i < j && arr[j] >=x) j--;
if (i < j)arr[i++] = arr[j];
//从左到右找到第一个大于x的数,然后填补j位置的坑
while (i < j && arr[i] <= x)i++;
if (i < j)arr[j--] = arr[i];
arr[i] = x;
//分治,将i的左右两边再次快排
quick_sort(arr,begin,i-1);
quick_sort(arr,i+1,end);
}
}
int main() {
int arr[9] = {
1,1,34,5,7,8,9,0,11};
quick_sort(arr,0,8);
for (int i:arr) {
cout << i << endl;
}
return 0;
}
//结果:
//0
//1
//1
//5
//7
//8
//9
//11
//34
Tri par sélection (O(N^2))
Idée de base :
à chaque fois, trouvez un plus petit nombre de la séquence non triée et insérez-le dans le dernier de la séquence triée
void SelectSort(int arr[],int lenght) {
int index = 0;
while (index!=lenght) {
int x = 1e9, temp = 0;
for (int i = index; i <lenght;i++) {
if (arr[i]<=x) {
temp = i;
x = arr[i];
}
}
swap(arr[index],arr[temp]);
index++;
}
}
Tri par fusion (O(N*logN))
Diviser pour régner Idées
Démo en images
//归并排序
//分治,分到长度为2的最小单元,让这个单元有序,然后在从下往上开始有序
void Merge(vector<int> &arr ,int front,int mid,int end) {
//注意拷贝的区间。
vector<int> left(arr.begin()+front, arr.begin() + mid+1 );//拷贝左半部分
vector<int> right(arr.begin() + mid + 1,arr.begin()+end+1);//拷贝右半部分
//在尾部插入一个编译器允许的int类型最大值。
left.insert(left.end(),numeric_limits<int>::max());
right.insert(right.end(),numeric_limits<int>::max());
int leftindex = 0, rightindex = 0;
for (int i = front; i <= end;i++) {
if (left[leftindex] < right[rightindex])arr[i] = left[leftindex++];
else arr[i] = right[rightindex++];
}
}
//归并排序
void MergeSort(vector<int> &arr,int front,int end) {
if (front >= end) return;
int mid = (front + end) /2;
MergeSort(arr,front,mid);
MergeSort(arr,mid+1,end);
Merge(arr,front,mid,end);
}