回 帖 发 新 帖 刷新版面

主题:一个关于快速排序的设计

采用快速排序方法对输入的数据按升序和降序两种顺序进行排序,并显示中间排序的过程。
算法怎么写啊,当然有代码也可以。多谢大虾了。(最好是C语言版的,其它的偶不会的。)

回复列表 (共3个回复)

沙发

快速排序的思想是:在待排序的n个记录中任选其中一个记录(通常是第一个)作为分区标准,若要升序排列就把所有小于该记录的记录排在左边大于该记录的则排到右边,反之则为降序,中间放所选记录。然后对前后两个子序列重复上述过程即可。
要显示中间结果,只须每完成一趟排序输出一次。

板凳


我的c++代码
#include <iostream>
using namespace std;
int length=0;
template<class T>
void quicksort(T a[],int m,int n)//对n+1个数排序,设pivotkey为m
{
    if(m==n) return;
    int left=m,right=n;    
    T temp=a[m];
    bool move_l=false,move_r=true;
    while(right>left)
    {
        if(move_r)
        {
            if(a[right]>=temp) {right--;}
            else{ a[left]=a[right];move_r=false;move_l=true;left++;}
        }
        else if(move_l)
        {
            if(a[left]<=temp) {left++;}
            else {a[right]=a[left];move_l=false;move_r=true;right--;}
        }
    }
    a[right]=temp;
    for (int i=0;i<=length-1;i++)cout<<a[i]<<"   ";
    cout<<endl;
    if(left>m+1)quicksort(a,m,left-1);    
    if(right+1<n)quicksort(a,right+1,n);

}
template<class T>
void Find(int *a,int&x)
{
    int count=1;
    int left=0,right=length-1,mid=(left+right)/2;
    while (left<=right&&x!=a[mid])
    {
        
        if(x>a[mid]) left=mid+1;
        else right=mid-1;
        count++;
        mid=(left+right)/2;
    }
    cout<<"查找了"<<count<<"次!"<<endl;
    if(a[mid]==x)cout<<"你要查找的数是第"<<mid+1<<"个!"<<endl;
    else cout<<"没有你要查找的数!"<<endl;
}
void main()
{
    cout<<"请输入你想排序的数的个数:"<<endl;
    int n;
    cin>>n;
    length=n;
    int *a=new int[n];
    cout<<"请输入你要排序的数:"<<endl;
    for(int i=0;i<n;i++)cin>>a[i];
    quicksort<int>(a,0,n-1);
    cout<<"请输入你要查找的数:"<<endl;
    int x;
    cin>>x;
    Find<int>(a,x);
}

3 楼


当然,你想要降序改个地方就成!

我来回复

您尚未登录,请登录后再回复。点此登录或注册