归并排序:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void Merge(int a[],int l,int m,int r,int b[]){
int pos,p1,p2;
pos = 0,p1 = l,p2 = m+1;
while(p1 <= m && p2 <= r){
if(a[p1] < a[p2])
b[pos++] = a[p1++];
else
b[pos++] = a[p2++];
}
while(p1 <= m) b[pos++] = a[p1++];
while(p2 <= r) b[pos++] = a[p2++];
pos = 0;
for(int i=l;i<=r;i++)
a[i] = b[pos++];
}
void MergeSort(int a[],int l,int r,int b[]){
if(l < r){
int m = (l+r)/2;
MergeSort(a, l, m, b);
MergeSort(a,m+1,r,b);
Merge(a,l,m,r,b);
}
}
int main(void){
int a[30],b[30];
srand((unsigned)time(NULL));
printf("排序前元素为:");
for(int i=1;i<=10;i++){
a[i] = rand() % 100;
printf("%d ",a[i]);
}
printf("\n");
MergeSort(a, 1, 10, b);
printf("排序后元素为:");
for(int i=1;i<=10;i++){
printf("%d ",a[i]);
}
return 0;
}
快速排序:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
void QuickSort(int a[],int l,int r){
if(l >= r) return;
int tem = a[l];
int i = l,j = r;
while(i != j){
while(a[j] >= tem && j > i)
j--;
swap(a[i],a[j]);//在右边找到一个比tem小的数把tem放进去,并把小的数放到左边
while(a[i] <= tem && i < j)
i++;
if(i < j)
swap(a[i],a[j]);//从左边找到一个比tem大的数把ten放进去,并把大的数放到右边
//完成这一步时a[i] = k;
}
//到i == j时就时左边的都比tem小,右边的都比tem大。
QuickSort(a,l, i);
QuickSort(a,i+1, r);
}
int main(void){
srand((unsigned)time(NULL));
int a[30];
printf("排序前为:");
for(int i=1;i<=10;i++){
a[i] = a[i] % 100;
printf("%d ",a[i]);
}
printf("\n");
QuickSort(a,1,10);
printf("排序后为:");
for(int i=1;i<=10;i++){
printf("%d ",a[i]);
}
return 0;
}
快速排序一般情况下是O(nlogn)的,如果一个数组已经接近有序,那么快排就回很慢接近O(n^2).越乱的序列快排比较快。而归并则比较稳定