快速排序主要是利用了递归的思想,才用分治法,通过一次排序将待排序的数据分割成独立的两部分,其中一部分都比关键字(哨兵)小,另一部分都比关键字(哨兵)大,然后再对这些独立的部分递归使用上述方法,空间复杂度低,速度相对来说快,时间复杂度为nlogn. 前面我们分析过:如果某个算法将问题分解成更小的子问题,独立地解决各个子问题,最后将结果综合起来比较。则其时间复杂度为Ologn.
在该算法中常将第一个数字或者最后一个数字当做哨兵,如果将第一个数字作为哨兵则先从最后一个数字开始移动扫描。
- void quick_sort(void *in_data, int low, int high)
- {
- int *data = (int *)in_data;
- int i,j,t,temp;
- if(low > high)
- return;
- temp = data[low]; //temp中存的就是基准数
- i = low;
- j = high;
- while(i != j)
- {
- //顺序很重要,要先从右边开始找
- while(data[j] >= temp && i < j)
- j--;
- //再找右边的
- while(data[i] <= temp && i<j)
- i++;
- //交换两个数在数组中的位置
- if(i < j)
- {
- t = data[i];
- data[i] = data[j];
- data[j] = t;
- }
- }
- //最终将基准数归位
- data[low] = data[i];
- data[i] = temp;
- quick_sort(data, low, i - 1);
- quick_sort(data, i + 1, high);
- }
- void quick_sort(void *in_data, int low, int high)
- {
- int *data = (int *)in_data;
- int i,j,t,temp;
- if(low > high)
- return;
- temp = data[low]; //temp中存的就是基准数
- i = low;
- j = high;
- while(i != j)
- {
- //顺序很重要,要先从右边开始找
- while(data[j] >= temp && i < j)
- j--;
- //再找右边的
- while(data[i] <= temp && i<j)
- i++;
- //交换两个数在数组中的位置
- if(i < j)
- {
- t = data[i];
- data[i] = data[j];
- data[j] = t;
- }
- }
- //最终将基准数归位
- data[low] = data[i];
- data[i] = temp;
- quick_sort(data, low, i - 1);
- quick_sort(data, i + 1, high);
- }
程序看上去很简洁,其实在项目中用处有限,递归算法比较栈的资源,只有改为非递归算法才有用。