最近只看了冒泡和快排这两个算法,今天面试就让写排序,用电脑写,一去就让写代码,贼慌,然后面试官小姐姐真的贼好看,就是和面试官小哥谈论我的简历,坐在我对面,看着我写代码真的贼慌。。
一开始本来想写快排,因为紧张,大脑短路,满脑子都在冒泡泡。。最后还是写了冒泡,,这里再回顾一下冒泡和快排吧,巩固一下,免得一紧张就慌的写不出来。
(一)冒泡泡排序法
总的思想就是从待排序表的底部,通过两两交换的将较小的元素交换到排序表上层。
注意两点:
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;
}