排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。
文章规划:
一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。
二。通过《大话数据结构》一书的截图,详细分析该算法 。
在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。
ps:一个较为详细的学习链接 http://blog.csdn.net/MoreWindows/article/category/859207
七。快速排序
一。个人理解
快速排序是对冒泡排序的一种改进。是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
(1) 分治法的基本思想
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序(再次分割成独立两部分),整个排序过程可以递归进行,直到每个部分只有一个数据为止,以此达到整个数据变成有序序列。
简单来说,可以分成以下三个过程:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
思路也比较简单,下面写了个测试程序,可以对照着理解下。
如果还有什么不懂的,可以看下第二部分,《大话数据结构》书中相关截图,挺详细的。
- #include<stdio.h>
- #define Max_ 10
- // 打印结果
- void Show(int arr[], int n)
- {
- int i;
- for ( i=0; i<n; i++ )
- printf("%d ", arr[i]);
- printf("\n");
- }
- // 交换数组元素位置
- void Swap( int *num_a, int *num_b )
- {
- int temp = *num_b;
- *num_b = *num_a;
- *num_a = temp;
- }
- // 对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置,
- // 在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素
- int Partition(int array[], int low, int high)
- {
- // 采用子序列的第一个元素为枢纽元素
- int pivot = array[low];
- while (low < high)
- {
- // 从后往前在后半部分中寻找第一个小于枢纽元素的元素
- while (low < high && array[high] >= pivot)
- {
- --high;
- }
- // 将这个比枢纽元素小的元素交换到前半部分
- Swap(&array[low], &array[high]);
- // 从前往后在前半部分中寻找第一个大于枢纽元素的元素
- while (low < high && array[low] <= pivot)
- {
- ++low;
- }
- // 将这个比枢纽元素大的元素交换到后半部分
- Swap(&array[low], &array[high]);
- }
- // 返回枢纽元素所在的位置
- return low;
- }
- // 快速排序
- void QuickSort(int array[], int low, int high)
- {
- if (low < high)
- {
- int n = Partition(array, low, high);
- QuickSort(array, low, n);
- QuickSort(array, n + 1, high);
- }
- }
- int main()
- { //测试数据
- int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
- //排序前数组序列
- Show( arr_test, Max_ );
- QuickSort( arr_test, 0, Max_-1 );
- //排序后数组序列
- Show( arr_test, Max_ );
- return 0;
- }
二。 《大话数据结构》一书截图分析
注:本文仅为分享知识,绝无商业用途。
如果以该种形式分享知识造成不必要的纠纷,还请第一时间告知。