Subversion Repositories Kolibri OS

Rev

Rev 975 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. //Áûñòðàÿ ñîðòèðîâêà. Leency 2008. GPL license.
  2.  
  3. void Sort_by_Size(int a, b)   // äëÿ ïåðâîãî âûçîâà: a = 0, b = <ýëåìåíòîâ â ìàññèâå> - 1
  4. {                                        
  5.         int i= a;
  6.         IF (a >= b) return;
  7.         FOR (j = a; j <= b; j++)
  8.         {
  9.                 IF (ESDWORD[file_mas[j]*304 + buf+72-8] <= ESDWORD[file_mas[b]*304 + buf+72-8])
  10.                 { file_mas[i] >< file_mas[j];   i++;}
  11.         }
  12.         Sort_by_Size (a, i-2);
  13.         Sort_by_Size (i, b);
  14. }
  15.  
  16.  
  17. void Sort_by_Name(int a, b)   // äëÿ ïåðâîãî âûçîâà: a = 0, b = <ýëåìåíòîâ â ìàññèâå> - 1
  18. {                                        
  19.         int i = a;
  20.         IF (a >= b) return;
  21.         FOR (j = a; j <= b; j++)
  22.                 IF (strcmp(file_mas[j]*304 + buf+72, file_mas[b]*304 + buf+72)<=0) { file_mas[i] >< file_mas[j];   i++;}
  23.         Sort_by_Name(a, i-2);
  24.         Sort_by_Name(i, b);
  25. }
  26.  
  27.  
  28. /*int partition1(dword a, b)
  29. {
  30.         dword i = a; byte filename1[256], filename2[256]; int n;
  31.         for (j = a; j <= b; j++)
  32.         {
  33.             //
  34.                 copystr(file_mas[j]*304 + buf+72, #filename1);
  35.                 copystr(file_mas[b]*304 + buf+72, #filename2);
  36.                 n=strlen(#filename1)-1;
  37.                 WHILE (filename1[n]<>'.') && (n>0) n--;
  38.                 IF (n) copystr(#filename1+n+1, #filename1);
  39.                 n=strlen(#filename2)-1;
  40.                 WHILE (filename2[n]<>'.') && (n>0) n--;
  41.                 IF (n) copystr(#filename2+n+1, #filename2);
  42.                 //
  43.                 n=strcmp(#filename1, #filename2);
  44.                 IF (n<0) { file_mas[i] >< file_mas[j];   i++;}
  45.                 IF (n==0) && (strcmp(file_mas[j]*304 + buf+72, file_mas[b]*304 + buf+72)<=0) { file_mas[i] >< file_mas[j];   i++;}
  46.         }
  47.         EAX = i-1;
  48. }*/
  49.  
  50. int partition1(dword a, b)
  51. {
  52.         dword i = a; byte filename1[256], filename2[256]; int n;
  53.         dword offset=buf+72;
  54.         for (j = a; j <= b; j++)
  55.         {
  56.             //
  57.                 copystr(file_mas[j]*304 + offset, #filename1);
  58.                 copystr(file_mas[b]*304 + offset, #filename2);
  59.                 n=strlen(#filename1)-1;
  60.                 WHILE (filename1[n]<>'.') && (n>0) n--;
  61.                 IF (n) copystr(#filename1+n+1, #filename1);
  62.                 n=strlen(#filename2)-1;
  63.                 WHILE (filename2[n]<>'.') && (n>0) n--;
  64.                 IF (n) copystr(#filename2+n+1, #filename2);
  65.                 //
  66.                 n=strcmp(#filename1, #filename2);
  67.                 IF (n<0) { file_mas[i] >< file_mas[j];   i++;}
  68.                 IF (n==0) && (strcmp(file_mas[j]*304 + offset, file_mas[b]*304 + offset)<=0) { file_mas[i] >< file_mas[j];   i++;}
  69.         }
  70.         EAX = i-1;
  71. }
  72.  
  73. void Sort_by_Type(dword a, b)   // äëÿ ïåðâîãî âûçîâà: a = 0, b = <ýëåìåíòîâ â ìàññèâå> - 1
  74. {                                        
  75.         int c;
  76.         IF (a >= b) RETURN;
  77.         c = partition1(a, b);
  78.         Sort_by_Type(a, c-1);
  79.         Sort_by_Type(c+1, b);
  80. }
  81.  
  82.  
  83.