什么是快速排序
快速排序可以说是对冒泡排序的一种改进,通过选择某个基准点经过一次排序,然后把数据通过基准点分为两个部分。一部分小于基准点;一部分大于基准点;
实现过程
设要排序的数据存放在数组A[0]...A[N-1]中,然后从数组总任意选择一个数据作为基准点,将所有比基准点小的数据放到它的前面,比它小的放到它的后面,这样经过一次交换就分成了两个独立的部分。接着在运用分治的思想,对剩下的接着进行快速排序。
分析过程
比如我们有一组数据: 52、45、63、98、21、7
步骤一:选择第一个数据也就是52作为基准点的话,先从最后向前找到第一个小于52的7
7、45、63、98、21、52 63————52
步骤二:接着从前找到第一个比45大的数据52
7、45、52、98、21、63 21————52
7、45、21、98、52、63 98————52
7、45、21、52、98、63
从最后一组数据中我们可以看出,经过一次的快速排序,就把数组根据52划分为了两个部分。接着只要在对前半部分和后半部分分别执行快速即可,用到了分治的思想。
代码实现
有了以上实现的过程,代码上就简单多了
/// <summary> /// 快速排序实现过程 /// </summary> /// <param name="s">要排序的数组</param> /// <param name="low">数组的第一个元素的下标</param> /// <param name="high">数组的最后一个元素的下标</param> /// <returns></returns> static int AdjustArray(int []s,int low,int high) { //把low和high分别赋给i和j int i = low, j = high; //以第一个元素为基准点,并且保存在x中 int x = s[i]; while(i<j) { //通过这个循环,从后向前查找第一个小于基准点的下标 while(i<j && s[j]>=x) { j--; } if(i<j) { //找到第一个小于基准点的后直接调换 s[i] = s[j]; //指针前移动 i++; } //与上面类似,从前向后找大于基准点的小标 while(i<j&& s[i]<x) { i++; } if(i<j) { //找到后发生调换 s[j] = s[i]; j--; } } //退出时,直接把基准点保存到目前的I中 s[i] = x; return i; } //分治,通过快速排完后,再对前半部分,后半部分分别进行快速排序 static void quick_sort1(int []s,int l,int r) { if(l<r) { int i=AdjustArray(s,l,r); quick_sort1(s,l,i-1); quick_sort1(s, i + 1, r); } }
学习心得
小编在学习中也是经过了一段时间琢磨完成的,劝各位想学的,就在纸上画画、电脑上敲一敲,你一定会开窍的。
原文:http://blog.csdn.net/luckyzhoustar/article/details/40833013