快速排序:
快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。
基本步骤为:
1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。
下面来看一个完整的演示过程:
数组序列顺序:4 6 5 2 7 3 1 8
快速排序顺序:1 2 3 4 5 6 7 8
字数不多,4张图了解一下,不懂留言;
下面来看一下代码实现:
#include<stdio.h>
//不按顺序展示数组数据
/*
//高级一点的遍历
void show(int *arry){
int i=0;
int *tmp;
tmp = arry;
for( ;i<8;i++)
printf("%d ",*tmp++);
printf("\n");
}*/
//普通遍历方式
void show(int arry[]){
int i=0;
for( ;i<8;i++)
printf("%d ",arry[i]);
printf("\n");
}
//用来交换数的位置
void change(int *a, int *b){
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
//快速排序展示
void sort(int *arry, int l, int r){
int *tmp;
int i=l,j=r;
if( l >= r )
return;
tmp = arry;
//当左面的数小于右面,右面自减,再次比较
while(l<r){
while(l< r && tmp[l] <= tmp[r]){
r--;
}
//改变数组的位置,即地址
change(&tmp[l], &tmp[r]);
//这个是,当左面的数小于右面,左面自增,再次比较
while(l < r && tmp[l] <= tmp[r]){
l++;
}
change(&tmp[l], &tmp[r]);
}
//递归函数
//左面
sort(arry, i, l - 1);
//右面
sort(arry ,l+1 ,j);
}
int main(){
//自定义数组
int arry[8] = {4,6,5,2,7,3,1,8};
// l=数组首下标 ,r=数组尾下标
int l=0,r=7;
//先展示一下自定义数组
printf("自定义数组为:\n");
show(arry);
//快速排序
sort(arry,l,r);
//展示快速排序的结果
printf("快速排序的结果为:\n");
show(arry);
return 0;
}