freesoft 发表于 2007-8-13 08:14:09

编程马拉松(3)

本贴引自第八阁论坛:http://bbs.chinadbg.cn/forum-7-1.html
还有飞翔技术论坛:http://www.powk.net/bbs/forumdisplay.php?fid=4&page=1
从键盘输入10个数,排序,请高手们写出高级语言+汇编+反汇编,代码
还有要注意,我写程序的错误,因为这才是真正要让大家学习的地方。
非常高兴看到大家的支持,你们发的程序,请在第二天加上注释。(主要是有错的程序)

基础知识:变量初始化,数组应用,条件判断,循环,和打印程序,还有基础的语法,还有一个任务找错!!。我写的是C代码,其它代码各个朋友自己理解一下,也可以PM发贴人。也可以发提问
以下是C语言,常用排序方法。注意一点是可以有方法提高效率的。

main()
{
int i,j,a,b;
for(i=0;i<10;i++)/*从键盘输入10个数*/
scanf("%d",&a) ;
/*以下冒泡排序*/
/*冒泡排序的基本思想:对于n个数进行排序(现假定是从大到小排序,以下均按此进行),将相邻两个数依次比较,将大数调在前头:也就是说第一个数和第二个数比较,大数放前,小数放后,第二个和第三个进行比较,大数放前、小数放后,然后依次类推。。。经过第一轮比较以后,我们找到一个最小数在最下面(沉底)。然后进行下一轮比较,最后一个数就不用再参加比较了,所以本轮就可以少比较一次。*/
for(i=0;i<10;i++)
for(j=0;j<10-i;j++)
   if(a<a)
{
b=a;a=a;a=b;
}
for(i=0;i<10;i++)
printf("%d\n",a);
getch();
/*以下选择排序*/
/*排序的基本思想:先从第一个数开始起,用第一个数和其它的数进行比较,如果比第一个数大就交换位置,否则不进行交换,这样经过第一轮比较我们就能够找出最大值放在第一位置,然后从第二个位置起再找次大数,这样依次下去,就可以进行整个数的排序,实践证明,n个数最多需要n-1轮排序就可以了。*/

/*以下插入排序*/
/*插入排序基本思想:(假定从大到小排序)依次从后面拿一个数和前面已经排好序的数进行比较,比较的过程是从已经排好序的数中最后一个数开始比较,如果比这个数小,继续往前面比较,直到找到比它大的数,然后就放在它的后面,如果一直没有找到,肯定这个数已经比较到了第一个数,那就放到第一个数的前面。*/

}



void Display(int a[], int n);

void InsertSort(int a[], int n);
void ShellSort(int a[], int n);
void BubbleSort(int a[], int n);
void QuickSort(int a[], int low, int high);
void SelectSort(int a[], int n);
void HeapSort(int a[], int n);

int main(int argc, char* argv[])
{
        int a ={83,78,12,45,189,98,54,10,17,18,
                                70,65,27,199,69,73,92,39,46,75,};
        Display(a,20);

        HeapSort(a,20);

        Display(a,20);

        int i = 0;
        scanf("%d", &i);
        return 0;
}
void Display(int a[], int n)
{
        for (int i=0; i<n; i++)
        {
                printf("%d", a);
        }
        printf("\n");
}

//插入排序
void InsertSort(int a[], int n)
{
        int key;
        int j;

        for (int i=1; i<n; i++)
        {
                key = a;
                j = i-1;
                while (j>=0 && key<a)
                {
                        a = a;
                        j--;
                }
                a = key;
        }
}

//Shell排序
void ShellSort(int a[], int n)
{
        int i,j,key;
        int dl = n/2;
       
        while (dl >0)
        {
                for (i=dl; i<n; i+=dl)
                {
                        key = a;
                        j = i - dl;
                        while (j>=0 && key<a)
                        {
                                a = a;
                                j = j - dl;
                        }
                        a = key;
                }
                dl = dl/2;
        }
}


//冒泡排序
void BubbleSort(int a[], int n)
{
        int tem, i, j, flag =1;

        for (i=1; i<n && flag; i++)
        {
                flag = 0;
                for (j=0; j<n-i; j++)
                {
                        if (a>a)
                        {
                                tem = a;
                                a = a;
                                a = tem;
                                flag = 1;
                        }
                }
        }
}


//快速排序中调用划分区域函数
int Partition(int a[], int low, int high)
{       
        int key = a;
       
        while (low < high)
        {
                while (low <high && a>=key) high --;
                a = a;

                while(low <high && a<=key) low ++;
                a = a;
        }
        a = key;
        return low;
}

//快速排序,递归函数,low为数组下界,high为数组上界
void QuickSort(int a[], int low, int high)
{
        int par;
       
        if (low < high)
        {
                par = Partition(a, low, high);
                QuickSort(a, low, par-1);
                QuickSort(a, par+1, high);
        }
}

//选择排序
void SelectSort(int a[], int n)
{
        int i,j,k,tem;

        for (i=0; i<n-1; i++)
        {
                k = i;
                for (j=i+1; j<n; j++)
                {
                        if (a > a)
                        {
                                k=j;
                        }
                }

                if (k!=i)
                {
                        tem = a;
                        a = a;
                        a = tem;
                }
        }
}

//堆排序中调用函数,从s这个结点开始调整堆为一个大堆
void AdjustHeap(int a[], int s, int n)
{
        int i;

        int key = a;
        for (i=s*2; i<=n; i=i*2)
        {
       
                if (i<n && a < a)
                {
                        i++;
                }

                if (key> a)
                {
                        break;
                }
               
                a = a;
                s = i;
        }
        a = key;
}

//堆排序
void HeapSort(int a[], int n)
{
        int i,j,tem;

        for (i=n/2; i>0; i--)
        {
                AdjustHeap(a, i, n);
        }

        for (j=0; j<n; j++)
        {
                tem = a;
                a = a;
                a = tem;

                AdjustHeap(a, 1, n-j-1);
        }

}



procedure TForm1.Button1Click(Sender: TObject);
var
InputString,ResultString:String;
TmpInt,IntCount,ErrorType,i,j:Integer;
IntNum:array of Integer;
begin
ResultString:='';
ErrorType:=0;
InputString:= InputBox('输入窗口', '输入10个整数请用空格隔开', '1 2 3 4 5 6 7 8 9 0');
InputString:=Trim(InputString)+' ';
while pos('',InputString)<>0 do Delete(InputString,pos('',InputString),1);//清除可能出现的多空格分隔符
If trim(InputString)='' then ErrorType:=1;//判断输入字符串的合法性
for i := 1 to Length(InputString) do
    begin
      if not (InputString in ['0'..'9',#$20]) then ErrorType:=1;
    end;
if ErrorType<>1 then //数据无异常开始
begin
   IntCount:=0;
   while Length(InputString)>0 do //开始填入数组
   begin
   IntNum:=StrToInt(LeftStr(InputString,pos(' ',InputString)-1)); //leftStr 从左取得分隔符之前的数字
   Delete(InputString,1,pos(' ',InputString));
   inc(IntCount);
   end;
   
//开始冒泡
for I := 0 to IntCount-1 do
begin
    for j := i to IntCount-1 do
    begin
       if IntNum<IntNum then
       begin
         TmpInt:=IntNum;
         IntNum:=IntNum;
         IntNum:=TmpInt;
       end;
   end;
   end;
//泡泡冒完
    for I := 0 to IntCount - 1 do
    ResultString:=ResultString+''+IntToStr(IntNum);
    Showmessage('共输入了'+IntToStr(IntCount)+'数字。排序:'+ResultString);
end
else ShowMessage('输入中含非数字字符或没有输入数据!'); //数据无异常结束
end;

我的第一个C++程序

第一种方法,主要是函数不同,以及调用方式的不同//C++版冒泡排序程序
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
      int tem = a;
      a = b;
      b = tem;
}


void main()
{
      int i,j,arr;
      for(i=0;i<10;i++)
      {
                cout<<"请输入10个整数:";
                cin>>arr;
    }
      for(i=0;i<10;i++)                         //数组数据的循环比较
      {      for(j=0;j<10-i-1;j++)    //每一轮的比较
         { if(arr<arr)       //比较相邻两个数大小
      {swap(arr,arr);    //互换函数的调用
                        
      }
      }
      }
      for(i=0;i<10;i++)
      {      cout<<"正确的从大到小的排序:"<<arr<<endl;
      }

}SWAP函数第二种实现及调用方法:void swap(int *a, int *b)
{int tem = *a;
*a = *b
*b = tem;
}
调用时是:swap(&arr,&arr)下面是对我这个程序的反汇编代码0041E450push    ebp                           ;从这里开始就是main()函数的开始
0041E451mov   ebp, esp
0041E453sub   esp, 108
0041E459push    ebx
0041E45Apush    esi
0041E45Bpush    edi
0041E45Clea   edi, dword ptr
0041E462mov   ecx, 42
0041E467mov   eax, CCCCCCCC
0041E46Crep   stos dword ptr es:
0041E46Emov   dword ptr , 0
0041E475jmp   short 0041E480
0041E477mov   eax, dword ptr                               ;eax就相当与i ,从这里开始循环
0041E47Aadd   eax, 1                                                      ;i++
0041E47Dmov   dword ptr , eax                              ;把i保存了
0041E480cmp   dword ptr , 0A   ;i与10比较
0041E484jge   short 0041E4AC                                        ;i大于10就跳
0041E486push    004570E4                                             ;请输入10个整数:
0041E48Bpush    004607D0            
0041E490call    0041CB6D                                                ;显示“请输入10个整数:”
0041E495add   esp, 8
0041E498mov   eax, dword ptr
0041E49Blea   ecx, dword ptr
0041E49Fpush    ecx
0041E4A0mov   ecx, 00460710
0041E4A5call    0041CAAA                                                 ;执行输入命令,相当与C++中的 cin<<arr
0041E4AAjmp   short 0041E477                                        ;跳回去循环


0041E4ACmov   dword ptr , 0                                 ;对i进行初始化
0041E4B3jmp   short 0041E4BE
0041E4B5mov   eax, dword ptr                               
0041E4B8add   eax, 1                                                         ;i++
0041E4BBmov   dword ptr , eax
0041E4BEcmp   dword ptr , 0A                              ;i与10比较
0041E4C2jge   short 0041E512                                           ;大于就跳
0041E4C4mov   dword ptr , 0                                 ;相当与对j初始化,j=0
0041E4CBjmp   short 0041E4D6
0041E4CDmov   eax, dword ptr                               
0041E4D0add   eax, 1                                                      ;j++
0041E4D3mov   dword ptr , eax                              
0041E4D6mov   eax, 0A                                                   ;从这里开始的三条指令其实就是10-i-1               
0041E4DBsub   eax, dword ptr
0041E4DEsub   eax, 1
0041E4E1cmp   dword ptr , eax                               ;这里就是j<10-i-1
0041E4E4jge   short 0041E510                                          ;大于就跳
0041E4E6mov   eax, dword ptr
0041E4E9mov   ecx, dword ptr
0041E4ECmov   edx, dword ptr
0041E4F0cmp   edx, dword ptr                      ;这里其实就是 if(arr<arr)      
0041E4F4jge   short 0041E50E                                             ;如果大于那么就不执行SWAP函数
0041E4F6mov   eax, dword ptr
0041E4F9lea   ecx, dword ptr
0041E4FDpush    ecx                                                             ;压入参数a
0041E4FEmov   edx, dword ptr
0041E501lea   eax, dword ptr
0041E505push    eax                                                            ;压入参数b
0041E506call    0041D20C                                                      ;这里就是SWAP互换函数
0041E50Badd   esp, 8
0041E50Ejmp   short 0041E4CD                                             ;返回进行for(j=0;j<10-i-1;j++) 循环
0041E510jmp   short 0041E4B5                                             ;返回进行for(i=0;i<10;i++) 循环


0041E512mov   dword ptr , 0                                    ;好了这里就是对最后一个循环的 i 初始化
0041E519jmp   short 0041E524
0041E51Bmov   eax, dword ptr
0041E51Eadd   eax, 1
0041E521mov   dword ptr , eax
0041E524cmp   dword ptr , 0A                                     ;比较 i<10
0041E528jge   short 0041E559                                                ;大于就跳
0041E52Apush    0041C505                                                       ;这个参数就是endl
0041E52Fmov   eax, dword ptr
0041E532mov   ecx, dword ptr
0041E536push    ecx
0041E537push    004570C8                                                      ;字符传“正确的从大到小的排序:”
0041E53Cpush    004607D0
0041E541call    0041CB6D                                                      ;这里还是显示字符串
0041E546add   esp, 8
0041E549mov   ecx, eax
0041E54Bcall    0041C631                                                      ;显示数据arr
0041E550mov   ecx, eax
0041E552call    0041CB9A                                                      ;将光标换行
0041E557jmp   short 0041E51B                                             ;返回继续循环
0041E559xor   eax, eax
0041E55Bpush    edx
0041E55Cmov   ecx, ebp
0041E55Epush    eax
0041E55Flea   edx, dword ptr
0041E565call    0041C5AF
0041E56Apop   eax
0041E56Bpop   edx
0041E56Cpop   edi
0041E56Dpop   esi
0041E56Epop   ebx
0041E56Fadd   esp, 108
0041E575cmp   ebp, esp
0041E577call    0041CD7A
0041E57Cmov   esp, ebp
0041E57Epop   ebp
0041E57Fretn

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming >
; by
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sorts.asm
; 排序算法
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Sorts.asm
; rc Sorts.rc
; Link /subsystem:windows Sorts.obj Sort.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .386
                .model flat, stdcall
                option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .data
szStr                        byte    255 dup (0)   
szBuffer      byte    255 dup (0)
Data                        dd      16,35,78,19,-10,23,56,-90 ,80,-7,5, 99, 10 ,12,1,13,18,17
DLen            dd      ($ - Data) / 4   
                .const
fmt         db      "%s %d", 0
fmt2      db      "%s排序后:", 0
szCaption   db      "排序算法", 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 冒泡排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BubbleSort proc uses ecxesiebxpData, Num
                  
                   mov eax, Num
                   dec eax
                   lea eax,
                   add eax, pData
                   mov ecx, eax          
                  
L_LOOP1:   mov esi, pData
                  
L_LOOP2:   mov eax,
                  
                   ;比较两个数
                   cmp eax,
                   jgNOT_SWAP
                  
                   ;交换两个数
                   mov ebx,
                   mov , eax
                   mov , ebx
                  
NOT_SWAP:add esi,4
                   cmp esi, ecx
                   jb L_LOOP2   ;地址比较为无符号比较
                  
                  
                   sub ecx,4
                   cmp ecx, pData
                   ja L_LOOP1   ;地址比较为无符号比较
                  
                   ret
BubbleSort endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 插入排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
InSertSort proc uses ecxesiediebxpData, Num
                  
                   mov ecx, 1
                  
                   ;esi 为将要插入数据的地址
L_LOOP:           mov esi, pData
                   lea esi,
                  
                   ;edi为在已排好序部分中,最后一个数的地址
                   movedi, esi
                   subedi, 4
                  
                   mov eax,
L_FIND_POS:   cmp eax,
                   jgeL_NEXT      
                  
                   ;在已排好序部分中,找到要插入数的位置
                   mov ebx,
                   mov , ebx
                   sub edi, 4
                   cmp edi, pData
                   jaeL_FIND_POS    ;地址比较为无符号比较
                  
L_NEXT:           mov , eax   ;插入到找到的位置。
                   inc ecx
                   cmpecx, Num
                   jl   L_LOOP               
                  
                   ret
InSertSort endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Shell 排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShelltSort proc uses ecxesiediebx edxpData, Num
                  local @key:DWORD
                  
                   mov edx, Num
                  
L_START:   sar edx, 1
                   jeSHELL_END
                   movecx, edx
                  
                   ;esi 为将要插入数据的地址
L_LOOP:           mov esi, pData
                   lea esi,
                  
                   ;edi为在已排好序部分中,最后一个数的地址
                   movedi, esi
                   lea ebx,
                   sub edi, ebx
                  
                   mov eax,
L_FIND_POS: cmp eax,
                   jgeL_NEXT      
                  
                   ;在已排好序部分中,找到要插入数的位置
                   mov ebx,
                   mov , ebx
                   lea ebx,
                   sub edi, ebx
                   cmp edi, pData
                   jaeL_FIND_POS    ;地址比较为无符号比较
                  
L_NEXT:           mov , eax   ;插入到找到的位置。
                  
                   leaecx,
                   cmpecx, Num
                   jl   L_LOOP
                                  
                   jmpL_START
SHELL_END:                  
                   ret
ShelltSort endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 选择排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SelectSort proc uses ecxesiediebxedxpData, Num
                   local @key:DWORD
                   mov eax, pData
                  
                   mov ecx, Num
                   dec ecx
                   lea ebx,
                  
                   movecx, 1
                  
L_LOOP:           mov esi, pData
             lea esi,
                   mov edx, esi
                   mov edi, esi
                  
L_LOOP2:   lea edi,
                   mov eax,
                   cmp eax,
                   jle   NEXT
                  
                   mov esi, edi
                  
NEXT:           cmp edi, ebx
                   jl L_LOOP2
                  
                   cmp esi, edx
                   je NOT_SWAP
                  
                   ;交换,
                   push
                   push
                   pop
                   pop
                  
NOT_SWAP:        inc ecx
                   cmp ecx, Num
                   jl L_LOOP
                  
                   ret
SelectSort endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 调整堆
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AdjustHeap proc uses ecxesiediebxedxpData, Base ,Num

                        local @key:DWORD
                       
                        mov eax, pData
                        mov ecx, Base
                        lea eax,
                        mov eax,
                        mov @key, eax
                       
L_LOOP:                mov eax, Base
                        lea eax,
                        mov ecx, eax
                       
                        mov edx, pData
                       
                        mov ebx, Num
                        cmpecx, ebx
                        jg    ADJUST_END
                       
                        cmp ecx, ebx
                        jge NOT_CHANG
               
                        lea esi,
                        mov eax,
                        cmpeax,
                        jge NOT_CHANG
                       
                        inc ecx
                       
NOT_CHANG:        lea esi,
                        mov eax,
                        cmp @key,eax
                       
                        jg ADJUST_END
                       
NEXT:                 push eax
                       
                        mov eax, Base
                        lea edi,
                        pop
                       
                        mov eax, ecx
                        mov Base, eax
                       
                        lea ecx,
                       
                        jmp L_LOOP
                             
ADJUST_END: mov eax, Base
                        lea edi,
                        mov eax, @key
                        mov , eax
                       
                        ret
AdjustHeap endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 堆排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HeapSort proc uses ecxesiediebxedxpData, Num
               
                mov ecx, Num
                sar ecx, 1
               
S_ADJUST:cmp ecx, 0
                jle NEXT
                invoke AdjustHeap, pData, ecx, Num
                dec ecx
                jmpS_ADJUST
               
NEXT:        xor ebx, ebx
S_CMP:        cmpebx, Num
                jge L_END
               
                mov ecx, Num
                sub ecx, ebx
                dec ecx
               
                mov edx, pData
                leaesi,
                push
               
                movedi,edx
                push
               
                pop
                pop
               
                inc ebx
               
                invoke AdjustHeap, pData, 1, ecx
               
                jmp S_CMP
               
L_END:                  
                ret
HeapSort endp


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 快速排序中调用划分区域函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Partition proc uses ecxesiediedx pData, iLow, iHigh
                        local @key:DWORD
                       
                        mov ecx, iLow
                        mov edx, iHigh
                        mov eax, pData
                       
                        moveax,
                        mov@key, eax
L_START:        cmpecx, edx
                        jge PART_END
                       
L_CMPHIGH:         cmp ecx, edx
                        jge NEXT
                       
                        mov eax, pData
                        lea esi,
                        mov eax,
                       
                        cmp eax, @key
                        jl NEXT
                        dec edx
                        jmp L_CMPHIGH
                       
NEXT:                mov eax, pData
                        lea edi,
                        lea esi,
                       
                        push
                        pop               
                       
S_CMPLOW:         cmp ecx, edx
                        jge NEXTLOW
                       
                        mov eax, pData
                        lea esi,
                        mov eax,
                       
                        cmp eax, @key
                        jg NEXTLOW
                        inc ecx
                        jmp S_CMPLOW
                       
NEXTLOW:        mov eax, pData
                        lea edi,
                        lea esi,
                       
                        push
                        pop                               
                       
                        jmp L_START
                       
PART_END:        mov eax, pData
                        lea esi,
                        push @key
                        pop
                       
                        mov eax, ecx
                       
                        ret
Partition endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 快速排序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
QuickSort proc uses eax ecxebxedxpData, iLow, iHigh
                       
                        mov ebx, iLow
                        mov edx, iHigh
                       
                        cmp ebx, edx
                        jge QUICK_END
                       
                        invoke Partition, pData, ebx, edx
                       
                        dec eax
                        invokeQuickSort, pData, ebx, eax
                       
                        lea eax,
                        invokeQuickSort, pData, eax, edx
                       
QUICK_END:
                        ret
                       
QuickSort endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


start:                                       
                        mov edi, 0
                       
L_ORIG:                mov eax,
                        invoke wsprintf, addr szBuffer, addr fmt, addr szBuffer, eax
                        inc edi
                        cmpedi, DLen
                        jb   L_ORIG
                       
                        invoke wsprintf, addr szBuffer, addr fmt2, addr szBuffer
                       
                        mov eax, DLen
                        dec eax
                        invoke ShelltSort, addr Data, DLen
                       
                        mov edi, 0
                       
L_SORT:                mov eax,
                        invoke wsprintf, addr szBuffer, addr fmt, addr szBuffer, eax
                        inc edi
                        cmpedi, DLen
                        jb   L_SORT
                       
                        invoke        MessageBox,NULL,offset szBuffer,offset szCaption, MB_OK
                        invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start


//java 的
import java.awt.*;
import javax.swing.*;
class Bb
{
      public static void main(String []args)
      {
                String b[]=new String ;
                int a[]=new int ;
      for(int i=0;i<10;i++)//输入数据
      {
                b=JOptionPane.showInputDialog("","请输入一个数");
                  try
                {
                                 a=Integer.parseInt(b);//类型转换
                                 System.out.println("您的输入为"+a);
                              }
                                 catch(Exception e) //异常处理
                              {
                                 System.out.println("输入的数据类型不对,请重新输入");
                                 i--;
                                 continue;//重新输入
                              }
            }
            for(int j=0;j<9;j++)//排序
         {
               for(int i=0;i<10;i++)
               {
            int temp;
            if(a<a)
            {
                      temp=a;
                      a=a;
                      a=temp;
            }
               }
            }
      System.out.println("下面是输出的结果");
      for(int i=0;i<10;i++)
      {
                System.out.println(a);
      }
          }
}

[ 本帖最后由 freesoft 于 2007-8-13 08:21 编辑 ]

小子贼野 发表于 2007-8-13 17:45:17

我最烦的就是用数组和指针了,但是不用这两个,就等于不会编程/:002

wofan 发表于 2007-8-13 20:46:53

非常的支持系列产品呀,建议楼主整理成CHM格式,方便下载并查询

[ 本帖最后由 wofan 于 2007-8-13 20:51 编辑 ]

freesoft 发表于 2007-8-14 07:47:52

到一定程序在做成CHM,这点是刚开始,还不到做CHM的程序。初级的东西弄的差不多了,进入中级时就做一个。
页: [1]
查看完整版本: 编程马拉松(3)