标签:十大 sdk 它的 code 开发工具 编程 第一个 bsp 简单选择排序
/* 先来看下快排 9.9 快速排序 事实上,不论是C++ STL、java SDK或者.NETFrameWork SDK等开发工具包中的源代码中都能找到它的某种实现版本。 快速排序算法是由图灵奖获得者TonyHoare设计出来的,他在形式化方法理论以及AL-GOL60编程语言的发明中都有卓越贡献, 是上世纪最伟大的计算机科学家之一,我们现在学习的这个快速排序算法,被列为20世纪十大算法之一。快去看下它到底有多牛吧。 希尔排序相当于直接插入排序的升级,他们同属于插入排序类 堆排序相当于简单选择排序的升级,他们同属于选择排序类 而快速排序其实就是我们前面认为最慢的冒泡排序的升级,他们都属于交换排序类,即他也是通过不断比较和移动交换来实现排序的, 只不过它的实现,增大了记录的比较和移动距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面, 从而减少了总的比较次数和移动交换次数。 快排思想: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序, 已到达整个序列有序的目的。 从字面上感觉不出它的好处来。假设现在要对数组{50,10,90,30,70,40,80,60,20}进行排序。我们通过代码的讲解来学习快速排序的精妙。 */ //对顺序表L作快速排序 void QuickSort(SqList *L) { QSort(L, 1, L->length); } /* ---------寻找枢轴记录,并在寻找的过程中swap交换排序-------是算法的重点 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置 此时在它之前(后)的记录均不大(小)于它 */ int Partition(SqList *L, int low, int high) { int pivotkey; //有子表的第一个记录作枢轴记录 pivotkey = L->r[low]; //从表的两端交替向中间扫描 while (low < high) { while(low < high && L->r[high] >= pivotkey) high--; //将比枢轴记录小的记录交换到低端 swap(L, low, high); while(low < high && L->r[low] <= pivotkey) low++; //将比枢轴记录大的记录交换到高端 swap(L, low, high); } //返回枢轴记录所在位置 return low; } //对顺序表L中的子序列L->r[low..high]作快速排序 void QSort(SqList *L, int low,int high) //这里的low和high { int pivot; if (low < high) { //将L->[low..high]一分为二 //算出枢轴值pivot pivot = Partition(L, low, high); //对低子表递归排序 QSort(L, low, pivot -1); //对高子表递归排序 QSort(L, pivot+1, high); } }
标签:十大 sdk 它的 code 开发工具 编程 第一个 bsp 简单选择排序
原文地址:https://www.cnblogs.com/go-ahead-wsg/p/13298251.html