最近觉得自己C学的太恶心了,回头补漏,先看递归,结果递归的例子就是快速排序,看完大神贴后,发一下所获。
注:为了方便起见,以从小到大排序为例,后面不再赘述。
首先从数组中选一元素,把其小的全部放在左边,大的放在右边,但小的部分和大的部分各自仍是无序的,此时称为一趟快速排序,之后左右部分分别递归下去,直到全部有序。
从概念中已经知道,这个每次选定的元素对于排序的快慢其决定性影响,如果恰好每次选定的都是最大值,那就和冒泡排序没两样了。
1.从一端开始,把小的扔到左边
2.从两端同时开始,向中间走,小的扔到左边,大的扔到右边;
显然2优于1
1>设定两个变量last,i存放数组下标,开始两数值都为当前最左端+1(即避开第一个特殊元素)(因为递归开始时,最左端值不一定为0),
2>i循环遍历整个数组,每次判断若当前数比last位置的数小,则++last,交换i与last的值,循环结束时交换last与最左端的值(即特殊元素),完成一趟快速排序
3>以last位置为界,递归左边,递归右边
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
//测试十万个无序随机数的数组
#define MAX 100000
//随机数生成
void my_srand();
void my_rand(int max);
void rand_data(int a[], int max);
//真正快速排序函数
void my_qsort(int v[], int left, int right);
//用于打印排序前后的值
void prtn(int a[], int n);
void swap(int v[], int i, int j);
int main(int argc, char *argv[])
{
int a[MAX];
快速排序的概念
注:为了方便起见,以从小到大排序为例,后面不再赘述。
首先从数组中选一元素,把其小的全部放在左边,大的放在右边,但小的部分和大的部分各自仍是无序的,此时称为一趟快速排序,之后左右部分分别递归下去,直到全部有序。
从概念中已经知道,这个每次选定的元素对于排序的快慢其决定性影响,如果恰好每次选定的都是最大值,那就和冒泡排序没两样了。
快速排序方法
一趟快速排序有两种方案:1.从一端开始,把小的扔到左边
2.从两端同时开始,向中间走,小的扔到左边,大的扔到右边;
显然2优于1
基础从1方案讲起
1>设定两个变量last,i存放数组下标,开始两数值都为当前最左端+1(即避开第一个特殊元素)(因为递归开始时,最左端值不一定为0),
2>i循环遍历整个数组,每次判断若当前数比last位置的数小,则++last,交换i与last的值,循环结束时交换last与最左端的值(即特殊元素),完成一趟快速排序
3>以last位置为界,递归左边,递归右边
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
//测试十万个无序随机数的数组
#define MAX 100000
//随机数生成
void my_srand();
void my_rand(int max);
void rand_data(int a[], int max);
//真正快速排序函数
void my_qsort(int v[], int left, int right);
//用于打印排序前后的值
void prtn(int a[], int n);
void swap(int v[], int i, int j);
int main(int argc, char *argv[])
{
int a[MAX];