面试常考:排序算法2(希尔排序,归并排序,堆排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/m0_37561165/article/details/81743565