数据结构(一) 交换排序

最近只看了冒泡和快排这两个算法,今天面试就让写排序,用电脑写,一去就让写代码,贼慌,然后面试官小姐姐真的贼好看,就是和面试官小哥谈论我的简历,坐在我对面,看着我写代码真的贼慌。。

一开始本来想写快排,因为紧张,大脑短路,满脑子都在冒泡泡。。最后还是写了冒泡,,这里再回顾一下冒泡和快排吧,巩固一下,免得一紧张就慌的写不出来。

(一)冒泡泡排序法

总的思想就是从待排序表的底部,通过两两交换的将较小的元素交换到排序表上层。

注意两点:

1、已经排过序的较小的元素不参与之后的排序,即嵌套的循环里面,从表尾一直循环到已经排序好的元素位置。

2、当剩余的元素已经有序时,不需要再执行剩下的循环判断工作,主要通过添加标记变量来判断是否有进行交换。

带排序的顺序表结构和swap函数如下:

typedef struct{
	int a[100];
	int len;
}SqList;
void swap(SqList *L, int i, int j)
{
	int temp;
	temp = L->a[i];
	L->a[i] = L->a[j];
	L->a[j] = temp;
}

冒泡实现(亲测有效)

void BubbleSort(SqList *list)
{
	bool flag = true;//第二个注意点
	for (int i = 0; i < list->len&&flag; i++)
	{
		flag = false;
		for (int j = list->len - 2; j >= i; j--)//第一个注意点
		{
			if (list->a[j] > list->a[j + 1])
			{
				swap(list, j, j + 1);
				flag = true;
			}

		}
	}
}

(二)快速排序(20世纪十大算法之一,听起来好厉害)

是基于分治法的交换排序。根据某个基准数值(通常是第一个),将表分成两部分,使得小于这个基准数的数都在基准数的左边,大于这个基准数的数都在基准数的右边。再分别对这两边进行同样的操作。需要用到递归的思想。

实现如下,代码量很少,重点在Partition()函数的实现上。

void QuickSort(SqList *list, int low, int high)
{
	if (low < high)
	{
		int piovtpos = Partition(list, low, high);
		QuickSort(list, low, piovtpos - 1);
		QuickSort(list, piovtpos + 1,high);
	}
}

需要保存当前待排元素的基准值pivot;指向表头的指针low,用下标表示(为了找到比pivot大的值);指向表尾的指针为high,用下标表示(为了找到比pivot小的值)。

再来琢磨一下这个Partition()方法,分治的方法有好几种,我就主要理解了以前课本上学的从两端开始查找,先找到比pivot小的(一定要先移动high指针),再找到比pivot小的,交换他们的位置,直到两个指针相遇,用pivot替换这两个指针相遇的位置,就把表分成了两个部分。主要要对比的就是pivot、a[low]、a[high]。把这三个数的顺序排好,填到相应的位置。先找到最小的,放在最左端,再找到最大的放到最右端,中间就放pivot。实现了整个交换的过程。

int Partition(SqList *list, int low, int high)
{
	int pivot = list->a[low];
	while (low < high)
	{
		while (low < high&&list->a[high] >= pivot)
		{
			--high;
		}
		list->a[low] = list->a[high];//从表的尾巴开始找到了比pivot小的,放到pivot左端
		while (low < high&&list->a[low] <= pivot)
		{
			++low;
		}
		list->a[high] = list->a[low];//从表的尾头开始找到了比pivot大的,放在pivot右端
	}
	list->a[low] = pivot;//在两个指针的相遇位置放下pivot使得左边的元素都小于pivot右边的都大于piovt
	return low;
}

测试用例:

int _tmain(int argc, _TCHAR* argv[])
{
	SqList list;
	int data[] = { 9, 10, 5, 6, 7, 8,1,2 };
	int len = sizeof(data) / sizeof(int);
	for (int i = 0; i < len; i++)
	{
		list.a[i] = data[i];
	}
	list.len = len;
	//cout << len << endl;
	//BubbleSort(&list);
	QuickSort(&list,0,len-1);
	for (int i = 0; i < list.len; i++)
	{
		cout << list.a[i] <<" ";
	}

	return 0;
}




猜你喜欢

转载自blog.csdn.net/u011310341/article/details/79531314