排序算法
问题
给定n个整数序列<a1,a2,…,an>,输出该序列的一个排列 <a1’,a2’,…,an’>,满足a1’<=a2’<=…<=an’。
快速排序
利用分治和二分的思想 选择一第1个元素为哨兵, 从2和N开始比较,若a[i]<a[1] a[j]>a[0] 两个交换,进行之后进行二分依次递归
#include<iostream>
using namespace std;
int a[100];
void swap(int a[], int i, int j){
int s = a[i];
a[i] = a[j];
a[j] = s;
}
void QuickSort(int a[], int l, int r){
if(l>=r) return;
int mid = a[l];
int i = l+1, j = r;
while(i<=j){
while(a[i]<mid && i<=r)
i++;
while(a[j]>mid)
j--;
if(i<j)
swap(a, i, j);
}
// while(1){
// while(a[i]<=mid && i<=r)
// i++;
// while(a[j]>=mid && j>l)
// j--;
// if(i>=j) break;
//
// swap(a, i, j);
// }
swap(a, l, j);
QuickSort(a, l, j);
QuickSort(a, j+1, r);
}
int main(){
int N;
cin>>N;
for(int i=1; i<=N; i++)
cin>>a[i];
// for(int i=1; i<=N; i++)
// cout<<a[i]<<" ";
QuickSort(a, 1, N);
for(int i=1; i<=N; i++)
cout<<a[i]<<" ";
return 0;
}
归并排序
利用分治和二分,先对两个进行排序,在部分排序之后再对整体排序
#include <iostream>
using namespace std;
int a[10000] = {};
int b[10000];
void Copy(int a[], int b[], int l, int r){
for(int i=l; i<=r; i++)
a[i] = b[i];
}
void Merge(int a[], int l, int r, int mid){
int L[mid-l+2];
int R[r-mid+2];
int q = 1, p = 1;
for(int i=l; i<=mid; i++){
L[q++] = a[i];
}
for(int i=mid+1; i<=r; i++){
R[p++] = a[i];
}
L[q] = 100000;
R[p] = 100000;
int o = l;
int m = 1,n = 1;
while(m<=q || n<=p){
if(L[m]<=R[n]){
b[o++] = L[m];
m++;
}
else {
b[o++] = R[n];
n++;
}
}
Copy(a, b, l,r);
}
void MergeSort(int a[], int l, int r){
if(l<r){
int mid = (l+r)/2;
MergeSort(a, l, mid);
MergeSort(a, mid+1, r);
Merge(a, l, r, mid);
Copy(a, b, l, r);
}
}
int main(){
int N;
cin>>N;
for(int i=1; i<=N; i++){
cin>>a[i];
//b[i] = a[i];
}
MergeSort(a, 0, N);
for(int i=1; i<=N; i++)
cout<<a[i]<<" ";
return 0;
}