㈠ 关于快排,请问哪儿错了
#include<iostream>
using namespace std;
void Qsort(int a[], int l, int r)
{int i=l,j=r;
a[0]=a[i];
if(l>=r) return ;
while(i!=j)
{
while(i<j&&a[j]>=a[0])
j--;
a[i]=a[j];
while(i<j&&a[i]<=a[0])
i++;
a[j]=a[i];
}
a[i]=a[0];
Qsort(a,l,i-1);
Qsort(a,i+1,r);
}
int main()
{
int a[100000],n,i;
cin>>n;
for (i=1;i<=n;i++)
{cin>>a[i];}
Qsort (a,1,n);
for (i=1;i<=n;i++)
{cout<<a[i]<<" ";}
system ("PAUSE");
EXIT_SUCCESS;
}
㈡ free pascal 快排。冒泡。 简单讲讲思想和区别。稳定。时间复杂度。
二分排序就是快排
var
x:array[1..60000] of longint;
n,i:longint;
procere qsort(v1,v2:longint);
var
xkey,i,j,t:longint;
begin
i:=v1;j:=v2;xkey:=x[(i+j) div 2];
while i<j do
begin
while xkey>x[i] do inc(i);
while xkey<x[j] do dec(j);
if i<=j then
begin
t:=x[i];x[i]:=x[j];x[j]:=t;
inc(i);dec(j);
end;
end;
if v1<j then qsort(v1,j);
if i<v2 then qsort(i,v2);
end;
begin
readln(n);
for i:=1 to n do read(x[i]);
qsort(1,n);
for i:=1 to n do
writeln(x[i]);
end.
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
var a:array[1..10] of integer; i,j,t,n:integer;begin readln(n); for i:=1 to n do readln(a[i]); for j:=1 to n-1 do for i:=1 to n-j do if a[i]<a[i+1] then begin t:=a[i];a[i]:=a[i+1];a[i+1]:=t;end; for i:=1 to n do write(a[i]:6);end.
选择排序每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。(比冒泡排序用时少)var a:array[1..10] of integer; i,j,t:integer;begin for i:=1 to 10 do read(a[i]); for i:=1 to 9 do begin for j:=i+1 to 10 do if a[i]<a[j] then begin t:=a[i];a[i]:=a[j];a[j]:=t;end; end; for i:=1 to 10 do write(a[i]:5);end.插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列看我打了那么多的份上 望采纳~