快速排序
一、快速排序的思想
安排三个变量low high key.
1、分配最初值:
low指向第一个,high指向最后一个,key既是设定的基准(自定义),一般就以第一个。
low = 1;high = n-1; 分别指向L.elem[1]、L.elem[n-1]。
--以序号的赋值方便交换数据--
2、一趟排序过程:
在low<=high的前提下:
从high端往前查找第一个比key值小的,与key交换位置。
再从low端往后查找第一个比key值大的,与key交换位置。
3、每一趟都将所排序列分为左右两部分,左边比基准小,右边比基准大。
二、代码实现:
顺序存储方式
#include <stdio.h>
#include <stdlib.h>
/*
快速排序的思想:
安排三个变量low high key.
分配最初值:
low指向第一个,high指向最后一个,key既是设定的基准(自定义),一般就以第一个。
low = 1;high = n-1; 分别指向L.elem[1]、L.elem[n-1]。
以序号的赋值方便交换数据。
一趟排序过程:
在low<=high的前提下:
从high端往前查找第一个比key值小的,与key交换位置。
再从low端往后查找第一个比key值大的,与key交换位置。
每一趟都将所排序列分为左右两部分,左边比基准小,右边比基准大。
*/
typedef struct{
int elem[9];//约定零号单元不存放信息-个人爱好哈。。
int length;//表长
}SqList;
//一趟快排算法
void Partition(SqList &L,int k,int &i);//k代表基准,i代表基准的位置。
int main(){
SqList L;
//L.elem[6] = {5,2,6,3,8};
int m;
for(int j = 1;j<6;j++){
scanf("%d",&m);
L.elem[j] = m;
}
int key = 1;
Partition(L,L.elem[1],key);
printf("%d key",key);//一趟和基准所在位置
printf("一趟快速排序后");
for(int i = 1;i<6;i++){
printf("%d ",L.elem[i]);
}
return 0;
}
void Partition(SqList &L,int k,int &i){
int low = 1;//低位
int high = 5;//高位
while(low <= high){
while(low<=high&&L.elem[high] >= k){//找到需要比k小的关键字所在的位置
high--;
}
//交换位置k和high的值
L.elem[i] = L.elem[high];
L.elem[high] = k;
i = high;
while(low <= high && L.elem[low] <= k){//找到需要比k大的关键字所在的位置
low++;
}
//交换位置k和low的值
L.elem[i] = L.elem[low];
L.elem[low] = k;
i = low;
}
}