快速排序
来源:互联网 发布:怎样在手机淘宝上评价 编辑:程序博客网 时间:2024/06/03 12:00
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
每一趟快速排序都把数组分成两部分,然后分别对前后两部分,在进行快速排序,这是一个递归的过程,直到子序列个数为1为止。
#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef char InfoType;typedef struct Sz{ int key; InfoType *info;}Sz;typedef struct SQ//定义一个顺序线性表{ Sz *R; int length;}SqList;int Init_SqList(SqList *L)//顺序线性表初始化{ L->R=(Sz *)malloc((MAX_SIZE + 1) * sizeof(Sz)) ; if(!L->R) return 0; else { L->length = 0; return 1; }}
一趟快速排序
//一趟快速排序算法int quick_one_pass(SqList *L , int low, int high){ int i = low; int j = high; L->R[0] = L->R[i];/*R[0]作为临时单元和哨兵*/ do { while ((L->R[0].key < L->R[j].key)&&(j > i)) j--; if(j>i) { L->R[i]=L->R[j] ; i++; } while((L->R[i].key < L->R[0].key)&&(j > i)) i++; if(j>i) { L->R[j] = L->R[i]; j--; } } while(i != j);/*i=j时退出扫描*/ L->R[i] = L->R[0]; return(i);}
递归调用一趟快速排序的算法
//快速排序(递归)void quick_Sort(SqList *L, int low, int high){ //low、high是每部分的起始位置和终端位置 int k; if(low < high) { k = quick_one_pass(L, low, high); quick_Sort(L, low, k-1); quick_Sort(L, k+1, high); }/*序列分为两部分后,分别对每个子序列快速排序*/}
main方法
int main(){ int i; int num; SqList L; Init_SqList(&L); /*输入排序码*/ printf("please enter the number of the data:"); scanf("%d", &num); for(i = 1; i < num + 1; i++){ int values; printf("please enter the %d data:", i); scanf("%d", &values); L.R[i].key = values; L.length++; } for(i = 1; i <= L.length; i++) { printf("%d ", L.R[i].key); } printf("\n"); printf("-----------------------------\n"); /*快速排序*/ quick_Sort(&L, 1, num); for(i = 1; i <= L.length; i++) { printf("%d ", L.R[i].key); } printf("\n"); return 0;}
例:
运行结果:
阅读全文