iPivPos = Lbb - 1;
for (i=Lbb; i<=Ubb-1; i++) {
if (L[ i ] <= iPivValue) {
iPivPos++;
swap(L[iPivPos], L[ i ]); } }
iPivPos++;
swap(L[iPivPos], L[Ubb]); return iPivPos; }
void quicksort(int L[], int Lbb, int Ubb) {
int iPiv;
if (Lbb < Ubb) {
iPiv = quicksort_partition(L, Lbb, Ubb); quicksort(L, Lbb, iPiv - 1); quicksort(L, iPiv + 1, Ubb); }
return; }
(十)使用C++标准库的快速排序函数
C++的标准库stdlib.h中提供了快速排序函数。
请在使用前加入对stdlib.h的引用:#include
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2)) 参数表
*base: 待排序的元素(数组,下标0起)。 num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。 int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。 比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。 控制返回值可以确定升序/降序。 一个升序排序的例程:
int Compare(const void *elem1, const void *elem2) {
return *((int *)(elem1)) - *((int *)(elem2)); }
int main()
{
int a[100];
qsort(a, 100, sizeof(int), Compare); return 0; }
(十一)PASCAL例程 1. 基本思想:
在当前无序区R[1..H]中任取一个数据元素作为比较的\基准\不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。 2. 排序过程: 【示例】:
初始关键字 [10 5 8 4 6 1 5 4 7 2](n为10) 第一次交换后[2 5 4 4 5 1] 6[ 8 10 ] 第二次交换后[2 1 4] 4 [5 5] 6 8[10 ] 第三次交换后1 2 4 4 5 5 6 8 10 最后的排序结果 1 2 4 4 5 5 6 8 10 type xxx=array[1..1000000] of longint; var a,n;longint; x:xxx;
procedure qsort(var x:xxx;l,r:longint);{x为要排序的数组,l为数组的要排序部分的起始位置,r为数组的要排序部分的终点位置} var n,i,j,mid:longint; begin
i:=l;{右边起点值} j:=r;{左边终点值}
mid:=x[(i+j) div 2]; {基准数(用随机化更快)} repeat
while (i<=j) and (x
if i<=j then{若左、右区未定(定且 左>基准数>右),交换} begin n:=x; x:=x[j]; x[j]:=n; inc(i); dec(j); end;
until i>j;{直到左右区已定(即左边终点j小于右边起点i)} if i
end; begin
readln(n);{读入要排序的数的个数}
for a:=1 to n do read(x[a]);{读入要排序的书} writeln;
qsort(x,1,n);{排序程序}
for a:=1 to n-1 do write(x[a],' ');{输出排好序得数} writeln(x[n]); end.
(十二)C语言随机化快排模块化代码 #include \ #include \ #include \
Location(int *a,int low,int high) {
int key,temp,x;
srand((unsigned)time(0)); x=rand()%(high-low+1)+low; key=a[x];
while(low while(x while(low return low; } Qsort(int *a,int low,int high) { int locat,i; if(low>=high)return 0; locat=Location(a,low,high); Qsort(a,low,locat-1); Qsort(a,locat+1,high); } (十三)快速排序的JAVA实现 import java.util.Arrays; public class QuickSort { public static void quickSort(int[] array) { quickSort(array, 0, array.length - 1); } private static void quickSort(int[] array, int low, int high) { if (low < high) { int p = partition(array, low, high); quickSort(array, low, p - 1); quickSort(array, p + 1, high); } } private static int partition(int[] array, int low, int high) { int s = array[high]; int i = low - 1; for (int j = low; j < high; j++) { if (array[j] < s) { i++; swap(array, i, j); } } swap(array, ++i, high); return i; } private static void swap(int[] array, int i, int j) { int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } /** * @param args */ public static void main(String[] args) { int[] arr ={12,3,5,4,78,67,1,33,1,1,1}; quickSort(arr); System.out.println(Arrays.toString(arr)); } } 二分法插入排序 #include int size; }sequence_list; void init_sequence_list(sequence_list *slt) { slt->size=1; } void insert_sequence_list(sequence_list *slt,datatype x) { if(slt->size==maxsize) printf(\表满,无法插入!\ slt->a[slt->size]=x; slt->size++; } void print_sequence_list(sequence_list slt) { int i; if(slt.size==1) printf(\表是空的!\ else for(i=1;i void insert_num_sequence_list(sequence_list *slt) { int x,i,j=1; printf(\请输入插入数的个数:\ scanf(\ do { scanf(\ insert_sequence_list(slt,x); j++; }while(j<=i); } void binarysort(sequence_list *slt) { int i,j,left,right,mid; for(i=2;i<=slt->size;i++) { slt->a[0]=slt->a[i]; left=1; right=i-1; while(left<=right) { mid=(left+right)/2; if(slt->a[0] for(j=i-1;j>=left;j--) slt->a[j+1]=slt->a[j]; slt->a[left]=slt->a[0]; } } void main() { int i; sequence_list slt; init_sequence_list(&slt); insert_num_sequence_list(&slt); printf(\表为:\\n\ print_sequence_list(slt); printf(\ binarysort(&slt); for(i=2;i<=slt.size;i++) printf(\ printf(\}