冒泡排序与快速排序

冒泡排序与快速排序

  • Test.c
  • SwapSort.h
  • SwapSort.c

Test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SwapSort.h"

void TestBubbleSort()
{
	int arr[] = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };
	int sz= sizeof(arr) / sizeof(arr[0]);
	BubbleSort(arr,sz);
	PrintArray(arr,sz);
}

void TestQuickSort()
{
	int arr[] = { 9, 1, 2, 5, 7, 4, 8, 6, 3, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	QuickSort(arr, 0,sz-1); //传数组的区间(下标)
	PrintArray(arr, sz);
}

int main()
{
	//TestBubbleSort();
	TestQuickSort();
	return 0;
}

SwapSort.h

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 

void PrintArray(int* a,int n);
void BubbleSort(int* a,int n);
void QuickSort(int* a,int begin,int end);


SwapSort.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SwapSort.h"

void PrintArray(int* a, int n)
{
	for (int i=0;i<n;i++)
	{
		printf("%d ",a[i]);
     }
	printf("\n");
}

void Swap(int* a,int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

//冒泡排序的时间复杂度为:O(N^2)。最好情况下为:O(N)【在标准顺序情况下】
void BubbleSort(int* a, int n)
{
	assert(a);
	for (int j=0;j<n;j++)
	{
		for (int i = 0; i < n - 1-j; i++)
		{
			if (a[i] > a[i + 1])
			{
				Swap(&a[i], &a[i + 1]);
			}
		}

	}
}


//(1)hoare法
// 选出一个key,一般是最左边或最右边的值。
//【排升序时】单趟排完以后:要求左边值比key要小,右边值要比key大。
int PartSort1(int* a, int begin, int end)
{
	int left = begin, right = end;
	int keyi = left;
	while (left < right)
	{
		//为什么左边做key,要让右边先走?
		//因为要保证相遇位置的值,比key要小。

		//右边先走,找小
		while (left < right && a[right] >= a[keyi])// (1)为什么要加上条件:left
		{
			right--;
		}
		//左边再走,找大
		while (left < right && a[left] <= a[keyi])
		{
			left++;
		}
		Swap(&a[left], &a[right]);
	}
	Swap(&a[keyi], &a[left]); //当left与right相遇时,交换a[keyi]与a[left]。
	keyi = left;

}

//(2)挖坑法
int PartSort2(int* a, int begin, int end)
{
	int keyi = begin;
	int piti = begin;
	while (begin<end)
	{
		//右边找小,填到左边的坑里去。这个位置形成坑。
		while (begin<end && a[end]>=a[keyi])
		{
			end--;
		}
		a[piti] = a[end];
		piti = end;

		//左边找大,填到右边的坑里去。这个位置形成坑
		while (begin<end && a[begin]<=a[keyi])
		{
			begin++;
		}
		a[piti] = a[begin];
		piti = begin;
	}

	a[piti] = a[keyi];
	return piti;
}

//(3)前后指针法
int PartSort3(int* a, int begin, int end)
{
	int prev = begin;
	int cur = begin + 1;
	int keyi = begin;

	while (cur<=end)
	{
      //cur位置的值小于keyi位置的值
	  /*if (a[cur]

		if (a[cur]<a[keyi])
		{
			prev++;
			Swap(&a[prev], &a[cur]);
		}
		cur++;
	}

	Swap(&a[prev],&a[keyi]);
	keyi = prev;

	return keyi;
}


void QuickSort(int* a, int begin,int end)
{
	//区间不存在,或者只有一个值则不需要再处理
	if (begin>=end)
	{
		return;
	}
	
	//int keyi = PartSort1(a, begin, end);
	  int keyi = PartSort2(a, begin, end);
	//int keyi = PartSort3(a,begin,end);
   

		// [begin,keyi-1] keyi [keyi+1,end]
		QuickSort(a,begin,keyi-1);
		QuickSort(a,keyi+1,end);
}

你可能感兴趣的:(数据结构,算法,排序算法)