版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37561165/article/details/81743565
希尔排序
O(N^d),最坏O(N^2),不稳定
void ShellSort(int A[],int N)
{
/*O(N^d),最坏O(N^2),不稳定*/
int Si,D,P,i;
int tmp;
int Sedgewick[]={929,505,209,109,41,19,5,1,0};//互质的复杂度最小
for (Si=0;Sedgewick[Si]>=N;Si++)//增量不能大于长度
;
for (D=Sedgewick[Si];D>0;D=Sedgewick[++Si])
{
for (P=D;P<N;P++)
{
tmp=A[P];
for (i=P;i>=D&&A[i-1]>tmp;i-=D)
A[i]=A[i-D];
A[i]=tmp;
}
}
}
简单选择排序
O(N^2),不稳定
void SimpleSelectionSore(int A[],int N)
{
int i,j,min;
for (int i=0;i<N-1;i++)
{
min=i;
for (int j=i+1;j<N;j++)
if(A[j]<A[min])
min=j;
swap(&A[i],&A[min]);
}
}
归并排序
#include <iostream>
using namespace std;
void Merge(int A[], int tmpa[], int L, int R, int rightend)
{
int LeftEnd, NumElements, Tmp;
LeftEnd = R - 1;
Tmp = L;
NumElements = rightend - L + 1;
while (L<=LeftEnd&&R<rightend)
{
if (A[L] <= A[R])
tmpa[Tmp++] = A[L++];
else
tmpa[Tmp++] = A[R++];
}
while (L <= LeftEnd)
tmpa[Tmp++] = A[L++];
while (R <= rightend)
tmpa[Tmp++] = A[R++];
for (int i = 0; i < NumElements; i++, rightend--)
A[rightend] = tmpa[rightend];
}
void Msort(int A[], int tmpa[], int L, int rightend)
{
int center;
if (L < rightend)
{
center = (L + rightend) / 2;
Msort(A, tmpa, L, center);
Msort(A, tmpa, center + 1, rightend);
Merge(A, tmpa, L, center + 1, rightend);
}
}
void Mergesort(int A[], int N)
{
int *tmpa = (int *)malloc(N*sizeof(int));
if (tmpa != NULL)
{
Msort(A, tmpa, 0, N - 1);
free(tmpa);
}
else
printf("malloc has no enough space");
}
int main()
{
int array[] = { 12, 56, 74, 941, 33, 5, 1, 0, 59, 4, 55 };
int N = sizeof(array) / sizeof(int);
Mergesort(array, N);
cout << array[0];
for (int i = 1; i < N; i++)
cout << " " << array[i]; cout << endl;
return 0;
}