选择排序
原理
依次从后面 选择 最小的元素放到前面。
实现-C
//编译环境:Window+Code::Blocks
#include<stdio.h>
#include<time.h>
#define random(x) (rand()%x)
void SelectionSort(int T[], int n) {
int i,j;
int minj, minx;
for(i=0; i<n-1; i++) {
minj = i; minx = T[i];
for(j=i+1; j<n; j++) {
if(T[j] < minx) {
minj = j;
minx = T[j];
}
}
T[minj] = T[i];
T[i] = minx;
}
}
int main(){
int n;
// Initialize
scanf("%d",&n);
int *T = (int*)malloc(sizeof(int)*n);
int i;
for(i=0 ; i<n ; i++){
T[i] = random(400000);
}
//Selection Sort
clock_t start,finish;
double TheTimes;
start=clock();
int times = 5;
for (i=0; i<times; i++)
SelectionSort(T, n);
finish=clock();
TheTimes=(double)(finish-start)/CLOCKS_PER_SEC/times;
printf("Time eclipse is %.6fs\n",TheTimes);
printf("\n");
return 0;
}
时间复杂度
n2
归并排序
原理
分治法,不断的将数列一分为二,直到子数列中只有一个元素。
实现-C
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define random(x) (rand()%x)
void Merge(int array[], int l, int mid, int r, int temp[])
{
int i, j, k;
k = 0;
i = l;
j = mid + 1;
while( i <= mid && j <= r ) {
if ( array[i] <= array[j] ){
temp[k++] = array[i++];
} else {
temp[k++] = array[j++];
}
}
while (i <= mid) {
temp[k++] = array[i++];
}
while (j <= r) {
temp[k++] = array[j++];
}
for (i = l; i<=r; i++) {
array[i] = temp[i-l];
}
}
void MergeSort_r(int array[],int l,int r,int temp[])
{
if (l<r) {
int mid = (l+r)/2;
MergeSort_r(array,l,mid,temp);
MergeSort_r(array,mid+1,r,temp);
Merge(array,l,mid,r,temp);
}
}
int MergeSort(int array[],int l,int r)
{
if(r < l)
{
return -1;
}
if(r == l)
{
return 0;
}
int len = r - l + 1;
int *temp = malloc(sizeof(int) * len);
if(temp == NULL)
{
return -2;
}
MergeSort_r(array, l, r, temp);
free(temp);
return 0;
}
int main(){
int n;
// Initialize
scanf("%d",&n);
int *T = (int*)malloc(sizeof(int)*n);
int i;
for(i=0 ; i<n ; i++){
T[i]= random(400000);
}
//Merge Sort
clock_t start,finish;
double TheTimes;
start=clock();
int times = 1000;
for (i=0; i<times; i++)
MergeSort(T, 0, n-1);
finish=clock();
TheTimes=(double)(finish-start)/CLOCKS_PER_SEC/times;
printf("Time eclipse is %.6fs\n",TheTimes);
printf("\n");
return 0;
}
时间复杂度分析
Best: nlg(n)
堆排序(没看懂)
时间复杂度
nlg(n)