මට අවශ්‍ය වන්නේ පරිශීලකයා ද්විත්ව පෙළක් ඇතුළත් කරන අතර වැඩසටහන මඟින් අරාව වර්ග කර ඇත


280

සටහන: මෙම ප්‍රශ්නය මා මෙහි පළ කළ දා සිට දැඩි ලෙස සංස්කරණය කරන ලදි. නීති මෙහි ගෙන යන ලදී, මෙහි අරමුණ අවබෝධ කර ගැනීම සඳහා පිළිතුරක් පළ කිරීමට පෙර ඒවා කියවන්න. කාණ්ඩයේ නිර්මාණය කරන ලද පළමු ප්‍රශ්නය මෙයයි .

Stack Overflow හි කම්මැලි පරිශීලකයෙකු මෙම ප්‍රශ්නය අසයි කියා සිතන්න:

මට අවශ්‍ය වන්නේ පරිශීලකයා ද්විත්ව පෙළක් ඇතුළත් කරන අතර වැඩසටහන මඟින් අරාව වර්ග කර ඇත. කරුණාකර ඔබට කේතය ලබා දිය හැකිද?

මෙම පරිශීලකයා ට්‍රොල් කරන කේත කැබැල්ලක් ඔබ නිර්මාණය කරන්නේ කෙසේද? අද්දැකීම් අඩු ක්‍රමලේඛකයෙකුට ප්‍රයෝජනවත් යැයි පෙනෙන නමුත් ප්‍රායෝගිකව එය සම්පූර්ණයෙන්ම නිෂ් less ල වන කේත කැබැල්ලක් සාදන්න.

ජයග්‍රාහකයා වඩාත්ම උත්තරීතර පිළිතුර වේ, පිළිතුර කෙසේ හෝ සුදුසුකම් නොලබන්නේ නම් හැර (සුදුසුකම් අවශ්‍යතා සඳහා, පිළිබඳ විකී විස්තරය බලන්න ). කලින් වඩාත්ම උඩු යටිකුරු කළ පිළිතුර අනාගතයේ දී පිළිගැනීමෙන් පසු උඩු යටිකුරු ගණනින් පරාජය වුවහොත්, නව හොඳම පිළිතුර පිළිගන්නා අතර පෙර පිළිතුර පිළිගත නොහැක. ටයි පටියකදී, මම ගැටගැසූ අය අතර කැමැත්ත පරිදි ජයග්‍රාහකයා තෝරා ගන්නෙමි, නැතහොත් තව ටිකක් ඉන්න.

කේතයක් නොමැති පිළිතුරු සුදුසු නොවේ. ඔවුන් විනෝදජනක විය හැකි අතර ඉහළ නැංවීම් ලබා ගත හැකි නමුත් ඒවා පිළිගනු නොලැබේ.

ටැග් විස්තරයෙන් රීති සොයාගත හැකිය .

සටහන: මෙය ප්‍රශ්නයකි. කරුණාකර ප්‍රශ්නය සහ / හෝ පිළිතුරු බැරෑරුම් ලෙස නොසලකන්න. වැඩි විස්තර මෙතැනින් .



6
lbluesm යමෙකු තමන්ගේ ඉගෙනීම "නාස්ති කරනවා" වෙනුවට ඔවුන්ගේ ගැටලුව විසඳන ලෙස වෙනත් අයෙකුගෙන් ඉල්ලා සිටීමට දැනටමත් තීරණය කර ඇත්නම්, ඔවුන්ට තනිවම ඉගෙන ගත හැකි ස්ථානයට සබැඳියක් පළ කිරීමෙන් කිසිදු යහපතක් සිදු නොවේ.
IQAndreas

3
ඇවැත්නි, මෙම ප්‍රශ්නය පැය 24 කට අඩු කාලයකදී ඉහළ නැංවීම් 100 ක් සහ දර්ශන 10,000 ක් ලබා ගැනීමට සූදානම් වේ!
ජෝ ඉසෙඩ්

18
මගේ යහපත්කම, වික්ටර්, ඔබේ ගැන කොටුව හරිම කනගාටුදායකයි ... අපි හැමෝටම අපේ උඩු යටිකුරුකම් තියෙනවා, නමුත් ඔබ ඔබටම පහර නොදිය යුතුයි. ඔබ දැන් සෑම තැනකම කෝඩ් ගොල්ෆ් ක්‍රීඩකයින් සඳහා වීරයෙකි!
සයිමන්ට්

4
මට පුදුමයි කිසිවෙකු තවමත් නින්ද වර්ග කිරීම මත විසඳුමක් ඉදිරිපත් කර නැත
ෆ්‍රෑන්ක් ෆාමර්

Answers:


178

සමහර විට මෙහි ප්‍රජාව ගෙදර වැඩ සඳහා උදව් කිරීමට කැමති නැත. ඔබට විහිළු පිළිතුරු ලැබෙන්නේ එබැවිනි. නමුත් මම උදව් කිරීමට කැමතියි. මෙන්න 'සී' හි සම්පූර්ණ විසඳුමකි (ජාවා හෝ රූබි සමඟ "ස්ක්‍රිප්ටින්" නොව "ක්‍රමලේඛනය" ඉගෙන ගැනීමට ඔබට අවශ්‍ය යැයි මම සිතමි). මම පළමු වරට ඉගෙන ගන්නා විට මා දැන සිටියා නම් බොහෝ ඉඟි ඇතුළත් කර ඇත

#include <stdio.h>

//Always use meaningful names for types
typedef unsigned char boolean;
#define True 't'
#define FALSE (!True)

//this is a really neat trick for swapping values efficiently
void swap(long* a,long *b) { *a=*a^*b;*b=*b^*a;*a=*a^*b; }

//Here's a readability improvement
#define until(condition) while(!(condition))

int main(int n, char*args[]){
  double *d;
  int i;
  char input[5];  //should be long enough for most doubles.
  boolean sorted = FALSE;

  //In C, you need to specify the array size beforehand, so ask
  printf("Please enter the length of the array\n");
  gets(input);
  //scan the input string and convert to a value
  sscanf(input,"%s",&input[0]);
  n=(long)atol(input);

  //allocate space, make sure you get the order of arguments right.
  d = calloc(sizeof(double),n); 

  //Get and sort the array
  until (sorted) {

     for (i=0;i<n;i++) {
        //It's important to always ask nicely
        printf("Please enter the %d%s array item\n",i,i==1?"st":"th");
        scanf("%lf",d+i);
     }
     //do a compare and exchange sort:
     sorted = !sorted;  //not sorted
     //check all the items
     printf("%d %d\n",i,n);
     for (i=1;i<n;i++) {
        //compare
        if (d[i]<d[i-1]) {
          //exchange 
          swap(d+i,d+i-1);
          sorted = FALSE;
        }
     }
     //show results
     printf("The array is%ssorted\n",sorted?" ":" not "); }
  //use the --> "downto operator" for counting downto 0. 
  for (;n-->0;) printf("%lf\n",*d++);
  }

32
සියලු උපදෙස් පාහේ වැරදියි, ඔබ එය දැනටමත් වර්ග කර ඇති තෙක් එය ආදාන ලැයිස්තුව ඉල්ලා සිටී.
AShelly

47
+1, සඳහා 1st, 2th, 3th, 4th...සහ පහළට ක්‍රියාකරු - ඉතා දියුණු සී ක්‍රමලේඛන ක්‍රම.
කායා

5
භාවිතා කළ යුතුය sscanf(input, "%5s", &input[0]), එසේ නොමැතිනම් ආදානය විග්‍රහ කිරීමේදී දෝෂ ඉක්මවා යා හැක. char input[sizeof(int)+1]64-බිට් පද්ධති සමඟ පසුගාමී අනුකූලතාව සඳහා ආදානය ප්‍රකාශයට පත් කළ යුතුය .
sh1

12
i==1?"st":"th"
hahaha

15
ජාවා සතුව කසළ එකතු වේ. එබැවින් ජාවා යනු “ස්ක්‍රිප්ටින්” සඳහා මිස සැබෑ ක්‍රමලේඛනය සඳහා නොවේ. එය මූලික CS101 ය. (ට්‍රොල්
එකද

181

මෙන්න එය ජාවා වල. එය මුළුමනින්ම වංචා කිරීම, පිළිගත නොහැකි සහ වෙනස් කළ නොහැකි වන්නේ එය MySQL දත්ත සමුදායක් නිර්මාණය කිරීම, එහි අංකය ඇතුළු කිරීම, ORDER BY වගන්තියක් සමඟ තෝරා ගැනීමක් කිරීම සහ MySQL විසින් ලබා දුන් සංඛ්‍යා ප්‍රතිදානය කිරීම ය. ඇත්ත වශයෙන්ම, වර්ග කිරීම සිදු කරන්නේ MySQL ය, වැඩසටහන නොවේ.

package sorter;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class SortingAlgorithm {

    private static final String CREATE_DB = "CREATE DATABASE sorting";
    private static final String DROP_DB = "DROP DATABASE sorting";
    private static final String CREATE_TABLE = "CREATE TABLE sorting.sorting ( num double not null )";

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        List<Double> doubles = new ArrayList<>(50);
        String typed;
        do {
            typed = JOptionPane.showInputDialog(null, "Type a double:");
            if (typed != null) doubles.add(Double.parseDouble(typed));
        } while (typed != null);

        List<Double> sorted = new ArrayList<>(50);

        try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "root")) {
            try (PreparedStatement ps = con.prepareStatement(CREATE_DB)) {
                ps.executeUpdate();
            }
            try (PreparedStatement ps = con.prepareStatement(CREATE_TABLE)) {
                ps.executeUpdate();
            }

            for (Double d : doubles) {
                try (PreparedStatement ps = con.prepareStatement("INSERT INTO sorting.sorting (num) VALUES (" + d + ")")) {
                    ps.executeUpdate();
                }
            }

            try (
                    PreparedStatement ps = con.prepareStatement("SELECT * FROM sorting.sorting ORDER BY num");
                    ResultSet rs = ps.executeQuery())
            {
                while (rs.next()) {
                    sorted.add(rs.getDouble("num"));
                }
            }
            try (PreparedStatement ps = con.prepareStatement(DROP_DB)) {
                ps.executeUpdate();
            }
        }

        JOptionPane.showMessageDialog(null, "The array sorted is: " + sorted);
    }
}

103
බොහෝ ජාවා කෝඩර්ස් පිරිවිතරයට පිළිගත හැකි විසඳුමක් ලෙස සලකන දේ සඳහා එය ඇත්ත වශයෙන්ම ගෙදරට ටිකක් සමීපයි !!
HostileFork පවසන්නේ SE

10
ඔබට ඉතා විශාල වස්තු වර්ග කිරීමට අවශ්‍ය අවස්ථාව ද සලකා බලන්න. දත්ත ගබඩාවක "වැඩසටහනෙන් පිටත" ඒවා වර්ග කිරීම ශක්‍ය විසඳුමකි.
වික්ටර් සීෆර්ට්

40
මෙහි ප්‍රමාණවත් සාරාංශයක් නොමැත. ඔබට අවම වශයෙන් අතුරුමුහුණත් 10 ක්, ක්‍රියාත්මක කිරීම් 20 ක්, එනුම්ස්, ඒකක පරීක්ෂණ, ආවරණ පරීක්ෂණ,
මේවන්

6
ඔබේ අදහස ක්‍රියාත්මක කිරීම සඳහා අපි MySQLSortEnterpriseEdition එකක් නිර්මාණය කළ යුතුයි. අපට ආරම්භ කිරීමට හැකි වන පරිදි මෙහි කේතය ජීපීඑල්-බලපත්‍ර ලබා දීමට වික්ටර් එකඟ වේද?
ජෝ ඉසෙඩ්

14
@ ජොයිස්. ඔව්, මගේ පිළිතුරට බලපත්ර ආකෘතිය පිළිබඳ අදහස් නොමැති අතර වැඩසටහන ආරම්භයේදී පරිශීලකයාට EULA පිළිගැනීමට සලස්වන්න. නමුත් මම එය කම්මැලි OP වෙත ලබා දෙන බැවින්, එය වාණිජ නොවන භාවිතය සඳහා නොමිලේ වන අතර, දිගු කලක් තිස්සේ බලා සිටි වාරිකය MySQLSortEnterpriseEdidtion නිර්මාණය කිරීමට ප්‍රයෝජනවත් වේ.
වික්ටර් ස්ටැෆුසා

142

සී # - අතිරික්තය වැනි kill ාතනයක් නැත

පළමුවෙන්ම, ආදරණීය GiMmEtHaCoDeZ, ඔබගේ කාර්යය බිඳ දැමීමට උත්සාහ කරමු:

  1. අංක කියවන්න
  2. ඒවා වර්ග කරන්න
  3. වර්ග කළ සංඛ්‍යා ප්‍රතිදානය කරන්න.

මෘදුකාංග ගැටලු සමඟ වැඩ කිරීමේදී "බෙදීම සහ ජය ගැනීම" ඉතා වැදගත් උපාය මාර්ගයක් බැවින්, ඒවා එකවර විසඳා ගැනීමට ඉඩ දෙන්න

1. කියවීම

මෘදුකාංගයේ තවත් වැදගත් කාරණයක් වන්නේ බහුකාර්යතාවයි. පරිශීලකයා සංඛ්‍යා ආදානය කරන්නේ කෙසේද යන්න නිශ්චිතව දක්වා නොමැති හෙයින්, එය කොන්සෝලය හරහා, ගොනුවක් හරහා, වෙබ් සේවාවක් හරහා සිදුවිය හැකිය. සමහර විට අපට මේ මොහොතේ සිතිය නොහැකි යම් ක්‍රමයක් පවා විය හැකිය. එබැවින්, අපගේ විසඳුමට විවිධ ආකාරයේ ආදාන සඳහා ඉඩ සැලසීම වැදගත් වේ. එය සාක්ෂාත් කර ගැනීම සඳහා ඇති පහසුම ක්‍රමය වනුයේ වැදගත් කොටස අතුරු මුහුණතකට උකහා ගැනීමයි, අපි කියමු

public interface IDoubleArrayReader
{
  IEnumerable<double> GetDoubles();

  DoubleArrayReaderType Type {get;}
}

DoubleArrayReaderTypeගණනය කිරීමක් ලබා දී ඇත්තේ කොහේද ?

public enum DoubleArrayReaderType
{
  Console,
  File,
  Database,
  Internet,
  Cloud,
  MockService
}

මෘදුකාංගය බිම් මට්ටමේ සිට පරීක්ෂා කළ හැකි පරිදි සකස් කිරීම ද වැදගත් ය, එබැවින් අතුරු මුහුණත ක්‍රියාත්මක කිරීම වනු ඇත

public class MockServiceDoubleArrayReader : IDoubleArrayReader
{
    IEnumerable<double> IDoubleArrayReader.GetDoubles()
    {
      Random r = new Random();  
      for(int i =0; i<=10; i++)
      {
        yield return r.NextDouble();
      }
    }

    DoubleArrayReaderType IDoubleArrayReader.Type 
    {
      get
      {
        return DoubleArrayReaderType.MockService;
      }
    }
}

ඊළඟට, තාර්කික ප්‍රශ්නය වන්නේ සුදුසු IDoubleArrayReaderකේතයට පැටවීමට අප දැන ගන්නේ කෙසේද යන්නයි . අපි සරල කර්මාන්ත ශාලාවක් භාවිතා කරන තාක් කල් එය පහසු ය:

public static class DoubleArrayInputOutputFactory
{
  private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;

  static DoubleArrayInputOutputFactory()
  {
      readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayReader)
          {
            readers.Add((instance as IDoubleArrayReader).Type, 
                        (instance as IDoubleArrayReader));
          }
        }
        catch
        {
          continue;
        }
      }
  }

  public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
  {
    return readers[type];
  }
}

සියලු ක්‍රියාකාරී පා readers කයින් පැටවීම සඳහා අපි පරාවර්තනය භාවිතා කරන බව සලකන්න, එබැවින් අනාගත ඕනෑම දිගු ස්වයංක්‍රීයව ලබා ගත හැක. දැන්, අපි දැන් කරන ප්‍රධාන කේතයේ ප්‍රධාන කේතයේ:

IDoubleArrayReader reader = DoubleArrayInputOutputFactory
                           .CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
var doubles = reader.GetDoubles();

2. සැකසීම (වර්ග කිරීම)

දැන් අපි සැකසීමට අවශ්‍යයි, එනම් අප ලබාගත් සංඛ්‍යා වර්ග කරන්න. පියවර එකිනෙකාගෙන් සම්පූර්ණයෙන්ම ස්වාධීන වන බව සලකන්න, එබැවින් වර්ග කිරීමේ උප පද්ධතියට, සංඛ්‍යා ආදානය කළේ කෙසේද යන්න ගැටළුවක් නොවේ. මීට අමතරව, වර්ග කිරීමේ හැසිරීම ද වෙනස් වීමට යටත් වන දෙයකි, උදා: අපට වඩාත් කාර්යක්ෂම වර්ග කිරීමේ ඇල්ගොරිතමයක් යෙදවීමට අවශ්‍ය විය හැකිය. ඉතින්, ස්වාභාවිකවම, අපි ඉල්ලූ සැකසුම් හැසිරීම අතුරු මුහුණතක උපුටා ගනිමු:

public interface IDoubleArrayProcessor
{
  IEnumerable<double> ProcessDoubles(IEnumerable<double> input);

  DoubleArrayProcessorType Type {get;}
}

public enum DoubleArrayProcessorType
{
  Sorter,
  Doubler,
  Tripler,
  Quadrupler,
  Squarer
}

වර්ග කිරීමේ හැසිරීම අතුරු මුහුණත ක්‍රියාත්මක කරයි:

public class SorterDoubleArrayProcessor : IDoubleArrayProcessor
{
    IEnumerable<double> IDoubleArrayProcessor.ProcessDoubles(IEnumerable<double> input)
    {
      var output = input.ToArray();
      Array.Sort(output);
      return output;
    }

    DoubleArrayProcessorType IDoubleArrayProcessor.Type 
    {
      get
      {
        return DoubleArrayProcessorType.Sorter;
      }
    }
}

ඇත්ත වශයෙන්ම, සැකසුම් අවස්ථා පැටවීම සහ කළමනාකරණය කිරීම සඳහා අපට කර්මාන්ත ශාලාවක් අවශ්‍ය වනු ඇත.

public static class DoubleArrayProcessorFactory
{
  private static Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor> processors;

  static DoubleArrayProcessorFactory()
  {
      processors = new Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayProcessor)
          {
            processors.Add((instance as IDoubleArrayProcessor).Type, (instance as IDoubleArrayProcessor));
          }
        }
        catch
        {
          continue;
        }
      }
  }

  public static IDoubleArrayProcessor CreateDoubleArrayProcessor(DoubleArrayProcessorType type)
  {
    return processors[type];
  }

}

3. ප්‍රතිදානය ලිවීම

මෙහි වැඩි යමක් කීමට කිසිවක් නැත, මෙය ආදානය පිළිබිඹු කරන ක්‍රියාවලියක් බැවින්. ඇත්ත වශයෙන්ම, අපට කියවීමේ හා ලිවීමේ කර්මාන්තශාලා එකකට ඒකාබද්ධ කළ හැකිය DoubleArrayInputOutputFactory, මේ ආකාරයට:

public interface IDoubleArrayWriter
{
  void WriteDoublesArray(IEnumerable<double> doubles);

  DoubleArrayWriterType Type {get;}
}

public enum DoubleArrayWriterType
{
  Console,
  File,
  Internet,
  Cloud,
  MockService,
  Database
}

public class ConsoleDoubleArrayWriter : IDoubleArrayWriter
{
    void IDoubleArrayWriter.WriteDoublesArray(IEnumerable<double> doubles)
    {
      foreach(double @double in doubles)
      {
        Console.WriteLine(@double);
      }
    }

    DoubleArrayWriterType IDoubleArrayWriter.Type 
    {
      get
      {
        return DoubleArrayWriterType.Console;
      }
    }
}


public static class DoubleArrayInputOutputFactory
{
  private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;
  private static Dictionary<DoubleArrayWriterType, IDoubleArrayWriter> writers;

  static DoubleArrayInputOutputFactory()
  {
      readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
      writers = new Dictionary<DoubleArrayWriterType, IDoubleArrayWriter>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayReader)
          {
            readers.Add((instance as IDoubleArrayReader).Type, (instance as IDoubleArrayReader));
          }
        }
        catch
        {
          continue;
        }
      }

      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayWriter)
          {
            writers.Add((instance as IDoubleArrayWriter).Type, (instance as IDoubleArrayWriter));
          }
        }
        catch
        {
          continue;
        }
      }

  }

  public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
  {
    return readers[type];
  }

  public static IDoubleArrayWriter CreateDoubleArrayWriter(DoubleArrayWriterType type)
  {
    return writers[type];
  }

}

එකට ඒ සියල්ල දමා

අවසාන වශයෙන්, අපගේ ප්‍රධාන වැඩසටහන අප විසින් දැනටමත් ගොඩනගා ඇති මේ අපූරු බව භාවිතා කරනු ඇත, එබැවින් කේතය පමණක් වනු ඇත:

var doubles = reader.GetDoubles();
doubles = processor.ProcessDoubles(doubles);
writer.WriteDoublesArray(doubles);

එහිදී, උදා: අපි නිර්වචනය කළ හැකි reader, writerසහ processorභාවිතා

IDoubleArrayReader reader = DoubleArrayInputOutputFactory.CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
IDoubleArrayProcessor processor = DoubleArrayProcessorFactory.CreateDoubleArrayProcessor(DoubleArrayProcessorType.Sorter);
IDoubleArrayWriter writer = DoubleArrayInputOutputFactory.CreateDoubleArrayWriter(DoubleArrayWriterType.Console);

49
Lol, ListSort Enterprise Edition © :-P +1
Doorknob

14
පිස්සු අධි කේතකරණය සඳහා +1. ඔබේ පිළිතුර 'මොඩියුල' පිළිතුරු 3 ක් හෝ වැඩි
ගණනකට බෙදීමට

15
ඉහළින් ඇති චෙරි යනු එය ඇත්ත වශයෙන්ම පුස්තකාල වර්ගයක් භාවිතා කිරීමයි :) එය සම්පූර්ණයෙන්ම පිරිවිතරයට හා සම්පූර්ණයෙන්ම
නිෂ් less ලයි

9
ඒක ... ලස්සනයි.
ඇන්ඩ rew

7
DI භාවිතා කිරීම OP ව්‍යාකූල කරනු ඇත, මෙය ඉක්මන් උදාහරණයක් පමණි.
SWeko

132

ඊටත් වඩා වචනානුසාරයෙන් අර්ථ නිරූපණය:

echo " aaehrrty"

එනම්, "අරාව" වර්ග කර ඇත.


5
මම මෙහි පැමිණියේ මෙය පළ කිරීමට ය.
Quuxplusone

5
ගොනුවක් ලෙස සුරකින්න sort.shසහ අමතන්නsh sort.sh "an array of doubles"
Kyss Tao

මම හිතන්නේ ඔබට "පරිශීලකයා ද්විත්ව යුගලයක් ඇතුළත් කරයි".
ඩුකලින්

1
කිස් ටාවෝගේ ප්‍රකාශයේ කාරණය එයයි. "an array of doubles"විධාන රේඛා තර්කයක් ලෙස ස්ක්‍රිප්ටයට යැවිය හැක.
AJMansfield

108

පර්ල්

CodeGolf.SE සඳහා මා විසින් කර ඇති සියලු දේ අතුරින්, මෙය බොහෝ විට ගත වූයේ අවම වශයෙන් පැය කිහිපයක් පමණි.

$_[0]=eval<>;
for(0..$#{$_[0]}**2){
 @_[$#_+1]=[\(@{$_[$#_]}),$#{$_[$#_]}+1];
 for(1..$#{$_[$#_]}-$#_){
  if(eval('${'x$#_.'@{$_[$#_]}[$_-1]'.'}'x$#_)>eval('${'x$#_.'@{$_[$#_]}[$_]'.'}'x$#_)){
   ${$_[$#_]}[$#{$_[$#_]}]=$_;
  }
 }
 (${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]-1],${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]])=(${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]],${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]-1]);
}
for(0..~~@{$_[0]}){
 $\.=eval('${'x$#_.'${$_[$#_]}[$_-1]'.'}'x$#_).','
}
$\=~s/,*$//;$\=~s/^,*//;$\="[$\]";
print;

ආදානය ස්වරූපයෙන් වන [2,4,5,7,7,3]අතර ප්‍රතිදානය ස්වරූපයෙන් [2,3,4,5,7,7]වේ.

මට දැන් පැහැදිලි කිරීමට වෙලාවක් නැත ... පසුව ආපසු එන්න.

කෙසේ වෙතත්, පර්ල් හි නිර්නාමික අරාව යනුවෙන් යමක් තිබේ. එය අරාවකි, නමුත් එයට නමක් නොමැත. කෙසේ වෙතත්, අප දන්නා දෙය එය යොමු කරන යොමු (මතක පිහිටීම) ය. වර්ග වරහන් වල සංඛ්‍යා මාලාවක් නිර්නාමික අරාවක් නිර්මාණය කරයි, එය එය වෙත යොමු කිරීමක් ලබා දෙයි.

මෙම පිළිතුර නිර්නාමික අරා මාලාවකින් ගොඩනගා ඇත @_. ආදානය නිර්නාමික අරාවක් බවට පරිවර්තනය වේ. ඉන්පසු අපි වෙනත් නිර්නාමික අරා නිර්මාණය කරමු, ඒ සෑම අංගයක්ම පෙර අරාවෙහි ඇති මූලද්‍රව්‍යයක් සඳහා යොමු කිරීමකි. අරාවෙහි ඇති මූලද්‍රව්‍ය වර්ග කිරීම වෙනුවට, අපි එම අරාවෙහි ඇති මූලද්‍රව්‍යයන්ට දර්ශක වර්ග කරමු. එසේම, වර්ග කිරීමේ මෙහෙයුමේ එක් එක් පියවර සඳහා (සහ තවත්) නව අරා අපි නිර්මාණය කරමු.


3
නපුර! නපුර! නපුර!
ඩී.ජී.එම්

56
වෙනත් ඕනෑම පර්ල් පිටපතක් මෙන් මට තේරුම් ගත හැකිය :)
කොරී ගෝල්ඩ්බර්ග්

6
@swelljoe ඇත්ත වශයෙන්ම, $_එම අවස්ථාවේදී හිස් නූලකි . මම අපේක්ෂිත ප්‍රතිදානය ගබඩා කර ඇති $\ අතර එය ප්‍රතිදාන වාර්තා බෙදුම්කරු වේ.
ෆිනොට්පී

4
Nd සරලයි. "එය ක්‍රියා කරන්නේ කෙසේද?"
ජෝන් ඩ්වොරක්

1
පරිශීලකයා විසින් සාදන ලද සියලුම විචල්‍යයන්ට සිතිය හැකි සම්මුතීන් අනුගමනය කරන ලස්සන නම් ඇත
හේගන් වොන් එයිට්සන්

80

පයිතන්

ආදාන අරාවෙන් වර්ග කළ අනුපිළිවෙලට නැති සියලුම අංග ඉවත් කිරීමෙන් පරිශීලකයාට වර්ග කළ අරාවක් ලබා දෙයි.

import sys

sorted = []
for number in map(float, sys.stdin.read().split()):
    if not sorted or number >= sorted[-1]:
         sorted.append(number)
print sorted 

ඇල්ගොරිතම ලැයිස්තුව හරහා යන්නේ එක් එක් මූලද්‍රව්‍ය එකතු කිරීමෙන් පමණක් ලැයිස්තුව ලැයිස්තුගත නොකෙරේ නම් පමණි. මේ අනුව ප්‍රතිදානය වර්ග කළ ලැයිස්තුවක් මිස මුල් ලැයිස්තුවේ සියලුම අංග අඩංගු නොවේ. ලැයිස්තුව පිළිවෙලට තිබේදැයි දෘෂ්ටි කෝණයෙන් විමසා බැලුවහොත් ප්‍රතිදානයේ අගයන් නැති බව ඔහු නොදකිනු ඇත.


1
ඔබේම පළ කිරීමට පෙර කරුණාකර වෙනත් පිළිතුරු බලන්න. ඔබ ඔබේ භාෂාවේ නම එකතු කළ යුතුය. මෙම ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා ඔබ OP ට්‍රොල් කිරීම සඳහා කරන්නේ කුමක්ද යන්න කෙටියෙන් පැහැදිලි කළ යුතුය.
වාසි

5
හෙහෙයි, මේ කෙනා මට හයියෙන් හිනා වුණා. කෙසේ වෙතත්, ටිකක් හොඳ පැහැදිලි කිරීමක් ප්‍රයෝජනවත් වනු ඇතැයි මම එකඟ වෙමි.
oconnor0

2
sys.stdin.read()යතුරු ලියනයකට ද්විත්ව ඇමතුම හෝ සැබෑ ට්‍රොලිං පිළිතුරේ කොටසක්ද? නිසැකවම එය අරාව ආදානය ලෙස ලබා දීම සහ
ප්‍රති result ලය

ඇවැත්නි, එය නපුරකි.
සිල්වර්ඩ්‍රැග්

13
O(n)ආකාරයේ ඇල්ගොරිතමය. හොඳයි.
ejrb

65

බාෂ්, අක්ෂර 54 යි

සී සහ පයිතන් වැනි මන්දගාමී අකාර්යක්ෂම භාෂා භාවිතා කරමින් පිළිතුරු ගොඩක් ... සියලු ස්ක්‍රිප්ටින් භාෂාවන්ගේ මව තුළ විසඳුමක් ලබා දීමෙන් දේවල් ටිකක් වේගවත් කරමු: බාෂ්.

ඔබ සිතන්නේ කුමක්දැයි මම දනිමි - පාවෙන ලක්ෂ්‍ය ගණිතය පවා බාෂ්ට කළ නොහැක, එබැවින් එය වර්ග කරන්නේ කෙසේද? හොඳයි, බලන්න, මම බලවත් SleepSort ඇල්ගොරිතම ක්‍රියාත්මක කිරීම:

#!/bin/bash

for i in $@; do echo -n $(sleep $i)$i' '& done
echo "Leveraging the power of your $(grep -c ^processor /proc/cpuinfo) cores to \
sort optimally by spawning $(jobs -l | wc -l) concurrent sorting threads..."
wait
echo -e "\nThe array sorted."

විධාන රේඛා තර්ක ලෙස වැඩසටහනට ආදානය ලබා දී ඇත. නියැදි ධාවනය:

> ./sleepsort.sh 7 1 4 3 2.752 6.9 0.01 0.02
Leveraging the power of your 4 cores to optimally by spawning 8 concurrent sorting threads...
0.01 0.02 1 2.752 3 4 6.9 7
The array sorted.

මෙහි ඉදිරිපත් කර ඇති සියලුම ක්‍රියාකාරී ඇල්ගොරිතම වලින් කෙටිම විය හැකි වාසියද මෙයයි. එය නිවැරදියි - එක් ප්‍රබල පේළියක් , බාෂ් බිල්ඩින් පමණක් භාවිතා කිරීම සහ බාහිර ද්විමය ඇමතුම් නොකිරීම (එනම්, ඔබ තනිකරම විකල්ප වාචික ප්‍රතිදානය ගණන් නොගන්නේ නම්). බොගෝසෝර්ට්ස් මෙන් නොව, එහි ධාවන කාලය නිර්ණායක වේ.

ඉඟිය: optim ලදායී ප්‍රශස්තිකරණය යනු වර්ග කිරීමට පෙර ආදාන සංඛ්‍යා සාධකයක් මගින් බෙදීමයි. ක්‍රියාත්මක කිරීම පා er කයාට ඉතිරි වේ.

සංස්කරණය කරන්න:

අඩු මුද්‍රණ සහිත 54-චාර් ගොල්ෆ් අනුවාදය කෙටි කර ඇත:

#!/bin/sh
for i in $@;do echo $(sleep $i)$i&done;wait

11
ට්‍රොලිං 1: ඇල්ගොරිතම ක්‍රියා කරයි, නමුත් පැහැදිලිවම අතිශය මන්දගාමී වේ - එය එක් එක් අංකයට නූල් විහිදුවයි, එම සංඛ්‍යාව ප්‍රතිදානය කිරීමට පෙර තත්පර ගණනක් නිදා ගනී (එය පිළිවෙලට). ට්‍රොලිං 2: මීට අමතරව, කේතයේ වැඩි හරියක් එහි කෙඳි කොපමණ ප්‍රමාණයක් තිබේද යන්න පිළිබඳව හොඳ අදහසක් ලිවීමට වැය වන අතර අනවශ්‍ය ලෙස හා අනවශ්‍ය ලෙස පද්ධතියේ සීපී තොරතුරු කියවා විග්‍රහ කරයි. ට්‍රොලිං 3: එය අවසානයේ “අරාව වර්ග කර” ඇති අතර එය සිදු කළ දෙය බව පෙනේ. ට්‍රොලිං 4: පරිශීලකයාට ctrl-c එබීමෙන් "වර්ග කිරීම" අවලංගු කළ නොහැක.
කැරලි

4
5. එය පමණක් මත වැඩ GNU / ලිනක්ස් , භාවිතා කිරීම හේතුවෙන් /proc/cpuinfo.
kps11346

5
අතිශයින්ම නිර්මාණාත්මක විසඳුම, මාර්ගය වන විට :)
දිමිත්‍රි

8
මෙය පුදුම සහගතය. එය කෙතරම් භයානකදැයි මට ප්‍රකාශ කළ නොහැක. මම එය සක්‍රියව භාවිතා කිරීමට සලකා බලමි, මන්ද එසේ නොවේ.

4
කොහේ හෝ තැනක නිෂ්පාදනයේ දී මම ඇත්ත වශයෙන්ම මෙහි ප්‍රභේදයක් ඇත. නමුත් එම තත්වය තුළ, ක්‍රියාවලියේ ධාවන කාලය වැදගත් වේ, එබැවින් එය මගේ නිදහසට කරුණකි ...
කැරලි

64

ජාවාස්ක්‍රිප්ට් තුළ සාදන ලද sort()ශ්‍රිතයක් ඇත, ඔබට එය මේ ආකාරයෙන් භාවිතා කළ හැකිය:

var numbers = [6, 2.7, 8];
numbers.sort();
// => [2.7, 6, 8]

... ඔහ්, සඳහන් කිරීම සම්පූර්ණයෙන් අමතක, එය lexicographic සඳහා, එනම්, තරාතිරමකම 10 < 9හා 9 < -100. කෙසේ හෝ ඔබ බලාපොරොත්තු වන්නේ එයයි.


8
එය ඊටත් වඩා හොඳ නිසා එය ගොඩනංවන ලද කාර්යයකි.
වේන් වර්නර්

62

(jPL) jQuery ක්‍රමලේඛන භාෂාව

ඒ සඳහා ඔබ jQuery භාවිතා කළ යුතුය . මෙම ගැටලුවට සරල විසඳුමක් පහත දැක්වේ:

function jSort() {
    var a = 0.0; // position 1
    var b = 0.0; // position 2
    var c = 0.0; // position 3

    var arr = [];
    var nArr = [];

    // don't forget to validate our array!
    if (window.prompt("You must only type double values. Type 1 if you accept the terms.") != 1) {
        alert("You can't do that.");
        return;
    }

    for (var i = 0; i < 3; i++) {
        if (i == 0) {
            var a = window.prompt("Type a double value");
            arr.push(a);
        }
        if (i == 1) {
            var b = window.prompt("Type a double value");
            arr.push(b);
        }
        if (i == 2) {
            var c = window.prompt("Type a double value");
            arr.push(c);
        }
    }

    // Now the tricky part
    var b1 = false;
    var b2 = false;
    var b3 = false;
    for (var i = 0 ; i < 3; i++) {
        // check if the variable value is the same value of the same variable which now is inside the array
        if (i == 0) {
            if (a == arr[i]) {
                b1 = true;
            }
        }

        if (i == 1) {
            if (b == arr[i]) {
                b2 = true;
            }
        }

        if (i == 2) {
            if (c == arr[i]) {
                b3 = true;
            }
        }
    }

    if (b1 == true && b2 == true && b3 == true) {
        if (arr[0] > arr[1]) {
            if (arr[0] > arr[2]) {
                nArr.push(arr[0]);
            } else {
                nArr.push(arr[2]);
            }
        }

        if (arr[1] > arr[0]) {
            if (arr[1] > arr[2]) {
                nArr.push(arr[1]);
            }
            else {
                nArr.push(arr[2]);
            }
        }

        if (arr[2] > arr[0]) {
            if (arr[2] > arr[1]) {
                nArr.push(arr[2]);
            } else {
                nArr.push(arr[1]);
            }
        }

        console.log(arr.sort(function (a, b) { return a - b }));
        alert(arr.sort(function (a, b) { return a - b }));
    }
}

jSort();


55
මම විශේෂයෙන් කැමතියි මෙය ඇත්ත වශයෙන්ම jQuery භාවිතා නොකරන ආකාරය .
KRyan

8
-1 ඔබේ මාලාවක් නාමකරණ යුතුය විශේෂයෙන් jQuery භාවිතා එවක වස්තූන්, එය හංගේරියානු අංකනය ඇතුළත් $භාවිතා පෙලගැස්මක් aහා ප්රතිඵල window.promptලෙස p.
ක්වන්ටාස් 94 බර

2
"උපක්‍රමශීලී කොටස" අලංකාරයි. OP, යම් දිනෙක එවැනි කේත ව්‍යුහයක් ලබා ගැනීමට උත්සාහ කරන්න.
ක්‍රිස් බාර්කර්

2
එම F'n doble "වලංගුකරණය" LOOOOOOOOOOOOL omg omg day made made! අඩු කැප් සඳහා සංස්කරණය කරන ලදි
HC_

54

සී

මෙම විසඳුම C විසින් සපයන ලද සංක්ෂිප්තභාවය සහ මෙහෙයුම් මට්ටමේ ප්‍රවේශය GNU / Linux හි ප්‍රබල, නැවත භාවිතා කළ හැකි මෘදුකාංග සංරචක සමඟ ඒකාබද්ධ කරයි:

#include <stdlib.h>

main(int argc, char **argv)
{
    system("echo Enter numbers one per line, ending with ctrl-D; sort -g");
}

4
හෝ "තිර රචනය": #!/usr/bin/sort.
යාන්ත්‍රික ගොළුබෙල්ලා

54

රූබි

print "Input an array of doubles: "
gets
puts "the array sorted."

තරමක් ස්වයං පැහැදිලි කිරීම.

නැතහොත් ආදානය ඇත්ත වශයෙන්ම "ද්විත්ව පෙළක්" වීමට අවශ්‍ය වේ:

print "Input an array of doubles: "
g = gets until /an array of doubles\n/
puts "the array sorted."

gets.chompඅමතර නපුර සඳහා භාවිතා නොකිරීම. OP පසුපස හඹා යාමෙන් පසු රීජෙක්ස් භාවිතා කිරීම, OP ඔබට තවත් ව්‍යාකූල කිරීම සඳහා ඔබට කළ හැකි බව මම නොදැන සිටියෙමි (ස්තූතියි ජෑන් ඩ්වොරක්)!


4
අදහස පුළුල් කරමින්, පරිශීලකයා නූලට ආදානය කරන තෙක් මම නැවත නැවතත් ආදානය ඉල්ලා සිටිමි an array of doubles.
Wrzlprmft

@Wrz හරි, ඉවරයි :-)
දොරක්නොබ්

2
එය අතිවිශිෂ්ටයි, මන්ද දුප්පත් OP හට නව රේඛාවක් ඉවත් කරන්නේ කෙසේදැයි සොයා ගැනීමට සිදුවනු ඇත (ඔබ getsඒ වෙනුවට භාවිතා කරන නිසා gets.chomp).
wchargin

Har ඩබ්ලිව්චාර්ජින් යෙප්, පළමු සංශෝධනයේදී මට එය තිබුණි (සංශෝධන ඉතිහාසය බලන්න) නමුත් එය ඊටත් වඩා නපුරු යැයි ඉවත් කර ඇත>: D සංස්කරණය කරන්න: අනේ ඉන්න, කමක් නෑ, ඒක මගේ අනෙක් පිළිතුරයි. මම මෙය සංස්කරණය කරමි :-)
ඩෝර්ක්නොබ්

1
+1 මම මෙහි ගිණුමක් නිර්මාණය කළෙමි, මෙය හරියටම මම එයට පිළිතුරු දෙන්නේ කෙසේද! ඒකට කැමති!
DGM

44

පයිතන් 3.3

ෂුවර්, ස්ටැඩින් හි වචනාර්ථයෙන් ලැයිස්තුවක් ලෙස ලබා දී ඇති අරාව වර්ග කළ හැකි සරලම පයිතන් වැඩසටහන මෙන්න :

collections = __import__(dir(object.__subclasses__()[7])[1][4:-3] + chr(116))

URL = ('https://www.google.com/search?client=ubuntu&channel=fs&q=dante+alighieri'
      '%27s+divina+commedia&ie=utf-8&oe=utf-8#channel=fs&q=__++divina+commedia+'
      'dante+alighieri+inferno+__').translate(
          dict.fromkeys(map(ord, '+-.:,;bcdefghjklopqrstuvwxyz/&=#?%')))[30:]
SECRET_KEY = URL[2:10][::-1][3:-1]
DATA = '{}{}{}'.format(URL[:2], SECRET_KEY[:2] + SECRET_KEY[:-3:-1], URL[-2:])



if getattr(DATA, dir(list)[7])(__name__):
    pieces = 'literally - evil'.split(' - ')
    r = getattr(collections, 
                '_'.join([pieces[0][:-2],
                          pieces[1].translate({ord('j')-1: 'a'})])
                )((getattr(globals()['__{}__'.format('buildings'.translate(
                        {100:'t', 103:None}))], 'in' r"put"))
                  ())
    tuple((lambda lst:
           (yield from map(list,
                           map(lambda k: (yield from k), 
                               ((lambda i: (yield from map(lambda t:
                                             (lst.append(lst[i]) or
                                              lst.__setitem__(i, lst[t]) or
                                              lst.__setitem__(t, lst.pop())),
                                              (j for j in range(i)
                                                if (lambda: lst[i] < lst[j])())
                                              ))
                                )(è) for è in range(
                                                getattr(lst,
                                                        dir(lst)[19])()))))
          )
        )(r))
    print(r)

අවාසනාවකට එය yield fromප්‍රකාශනය භාවිතා කරන බැවින් එය ක්‍රියාත්මක වන්නේ python3.3 + හි පමණි . කේතය තරමක් ස්වයං පැහැදිලි කිරීමක් විය යුතුය, එබැවින් එය ඔබේ මහාචාර්යවරයාට භාරදීමේදී ඔබට කිසිදු ගැටළුවක් ඇති නොවිය යුතුය.


ට්‍රොලිං කිරීම යනු OP අදහස් කළ දෙය හරියටම කරන පරිපූර්ණ ක්‍රියාකාරී විසඳුමක් සැපයීමයි , නමුත් එය එසේ වන්නේ:

  • තේරුම් ගැනීමට නොහැකි (ආරම්භකයකු විසින්)
  • ගුරුවරයාට හසුරුවා ගත නොහැකි නිසා:
    • OP ට එය තේරුම් ගත නොහැක
    • ඔහුට හැකි වුවද ගුරුවරයාට එය තේරුම් ගැනීමට තේරුම් ගැනීමට කාලය නැත
  • ක්‍රමලේඛය ඔහුට එතරම් අපහසු නැතැයි සිතිය හැකි අහිංසක නවකයෙකුට බියජනක

සාරාංශයක් ලෙස, මෙම පිළිතුර කිසියම් දෘෂ්ටි කෝණයකින් පරිපූර්ණ වලංගු පිළිතුරු සහිතව ශිෂ්‍යයාගේ ඉල්ලීම් සමච්චලයට ලක් කිරීමේ කලකිරීම බෙහෙවින් වැඩි කරයි.


(ඉහත කේතය තේරුම් ගැනීම අභියෝගයක් ලෙස ඔබ සලකන්නේ නම් කියවන්න එපා)

ක්‍රියාත්මක කළ වර්ග කිරීමේ ඇල්ගොරිතම ඇත්ත වශයෙන්ම ට්‍රොලිං කිරීම ද වැඩි වන බව මම එකතු කළ යුතුය

බුබුලු වර්ග කිරීම! ... එය නිසැකවම OP ට පවා තේරුම් ගත හැකි ආකාරයට ක්‍රියාත්මක කළ හැකිය. එය අපැහැදිලි ඇල්ගොරිතමයක් නොවේ, OP වෙනත් ආකාරයකින් පරිපූර්ණව තේරුම් ගත හැකි දෙයක් පිළිබඳ හොඳ කේත-අපැහැදිලි කිරීමකි.


3
මෙය වඩාත් පැහැදිලි කිරීමක් භාවිතා කළ හැකි යැයි මම සිතමි; ඔබ දැන් ඉන්ෆර්නෝ වෙත කරන්නේ කුමක්ද?
KRyan

1
වාව්, ඔබට පයිතන් හි ඇස්කි නොවන විචල්‍ය නම් කළ හැකිද? දැනගෙන හිටියේ නැහැ ...
kratenko

1
@kratenko python3 + වෙතින්. පයිතන් 2 හි පරිවර්තකය ASCII කේතන ක්‍රමයක් ලෙස උපකල්පනය කරන අතර එය දෝෂයක් මතු කිරීමට ඉඩ තිබුණි. පයිතන් 3 හි පරිවර්තකය යූටීඑෆ් -8 කේතන ක්‍රමයක් ලෙස උපකල්පනය කරන අතර හඳුනාගැනීම් සඳහා යුනිකෝඩ් ගුණාංග මගින් “අකුරු” ඇති සියලුම අක්ෂර පිළිගනී.
බකුරියූ

3
R කේ රයන්: ඔහු පැහැදිලිවම රවුම් නවයට මිනිසුන් ගෙන්වා ගැනීම සඳහා නිරය භාවිතා කරන වර්ග කිරීමේ ක්‍රමය භාවිතා කරයි.
ජෝ ඉසෙඩ්

10
ඔහ් මගේ යහපත්කම… +1 සඳහා.
ෂෝන් ඇල්රෙඩ්

41

සී - මන්දගාමී, භාවිතා කිරීමට අපහසු, පිළිගත නොහැකි කේතීකරණ විලාසය

වර්ග කිරීමේ ඇල්ගොරිතම මන්දගාමී ලෙස හැඳින්වෙන අතර n ^ (ලොග් n / 2) වටා ඇති හොඳම අවස්ථාව (සරල බව ) ඇත. ඇල්ගොරිතම ඇන්ඩ්‍රි බ්‍රොඩර් සහ ජෝර්ජ් ස්ටොල්ෆි විසින් ඔවුන්ගේ “පෙසිමල් ඇල්ගොරිතම සහ සරලතා විශ්ලේෂණය” යන මහා පුවත්පතේ ප්‍රකාශයට පත් කර ඇති අතර එය හොඳ සිනහවක් සහ සිතුවිලි සඳහා ආහාර සඳහා මම බෙහෙවින් නිර්දේශ කරමි.

void sort(double* arr, int n, int i, int j)
{
        if(i < j) {
                int m = (i+j)/2;
                sort(arr, n, i  , m);
                sort(arr, n, m+1, n);
                if(arr[m] > arr[j]) {
                        double t = arr[j];
                        arr[j] = arr[m];
                        arr[m] = t;
                }
                sort(arr, n, i, j-1);
        }
}

කෙසේ වෙතත් වර්ග කිරීම නිෂ් less ල ය, එබැවින් පරිශීලකයාට ඔවුන් වර්ග කිරීමට අවශ්‍ය දත්ත ඇතුළත් කිරීමට අපට ක්‍රමයක් අවශ්‍ය වේ. ද්විත්ව විග්‍රහ කිරීම වේදනාවකි, එබැවින් ඒවා බයිට් මගින් බයිට් කරන්න.

const unsigned MAX_ELEMS = 100;
int main()
{
        int i=0, j=0, len;
        char a[MAX_ELEMS*8];
        double* arr = (double*) a;
        short isNull=1;

        while(1) {
                a[i++] = getchar();
                if(i%8 == 0) {
                        if(isNull)
                                break;
                        isNull = 1;
                }
                else if(a[i-1] != 0)
                        isNull = 0;
        }

        len=i/8 - 1;

        sort(arr, len-1, 0, len-1);

        for(i = 0; i < len; i++)
        {
                printf("%f ", arr[i]);
        }
}

එය ක්‍රියාත්මක වන බව ඔප්පු කිරීමට:

 $ gcc -g trollsort.c -o trollsort
trollsort.c: In function ‘main’:
trollsort.c:43:3: warning: incompatible implicit declaration of built-in function ‘printf’
 $ echo -en "\0\0\0\0\0\xe4\x94\x40\0\0\0\0\0\0\xf0\x3f\0\0\0\0\0\0\x45\x40\0\0\0\0\0\0\0\0" | ./trollsort
1.000000 42.000000 1337.000000

අවසානයේ අපට ඇත්තේ:

  • මා දන්නා මන්දගාමී නිර්ණායක වර්ග කිරීමේ ඇල්ගොරිතම
  • ලැයිස්තු දිග මත නිහ ced කේත කේත සීමාවන්
  • නියත වශයෙන්ම භයානක ආදානය, මට ප්‍රතිදානය සමාන කළ හැකි නමුත් මම හිතන්නේ එය මේ ආකාරයෙන් විනෝදජනක ය.
    • සලකා බලන්න: වැඩසටහන භාවිතා කිරීම සඳහා ඔබේ යන්ත්‍රය කුමන අන්තරායක්ද යන්න ඔබ දැනගත යුතුය.
    • ඔබට 0 ආදානය කළ නොහැක (-0 හරි)
  • දර්ශක අංක ගණිතය සහ ඕනෑම ආකාරයකින් දර්ශකයන් ලෙස වර්ග කර ඇති බැවින් ඒවා ගැන එතරම් තැකීමක් නොකරයි

බයිට් 7 ට වඩා වැඩි සියලුම යෙදවුම් සඳහා මෙය නිර්වචනය නොකළ හැසිරීමක් ඇත. පිළිගත හැකි පිළිතුරක් නොවේ.
මයිකල් ස්පෙන්සර්

1
"පෙසිමල් ඇල්ගොරිතම" කඩදාසි වලට ආදරය කරන්න; ස්තූතියි.
රයන්

මෙම - "මම ගැන දන්නවා ඇති වඩාත්ම මන්දගාමී වේ අයනික තෝරා බේරා ගැනීමේ ඇල්ගොරිතමය" provably මන්දගාමී වේ අයනික තෝරා බේරා ගැනීමේ ඇල්ගොරිතමය. පුවත්පතේ සම්පූර්ණ කාරණය එයයි, AFAIR.
කොන්රාඩ් රුඩොල්ෆ්

Ic විස්තාරණය කිරීමට මයිකල් ස්පෙන්සර් රැකවරණය? මම ආදාන ප්‍රමාණයෙන් බයිට් 24 ක් සහිත උදාහරණයක් ලබා දුන් අතර ප්‍රතිදානය යනු කෙනෙකු අපේක්ෂා කරන දෙයයි (මම හිතන්නේ මට මෙහි විහිළුවක් නැතිවිය හැකිය).
ෂියෝනා

2
As සාෂෝ නමුත් බොගෝ වර්ග කිරීම සඳහා හොඳම අවස්ථාව වන්නේ ඔමේගා (එන්) (n-1 සැසඳීම්, මෙහෙයුම් 0) ය. ඒක ගොඩක් වේගවත්, අකා. \ ඔමේගා (n ^ (ලොග් n / 2)) ට වඩා නරක ය.
ෂියෝනා

39

රූබි, නපුරු බොගෝසෝර්ට්! (පාරිතෝෂිකය: පරිශීලක ආදානය අනුව බොගොසෝර්ට්)

print "Input array of doubles, separated by commas: "
arr = gets.split(",")
arr.shuffle! until arr.each_cons(2).all? {|x| x[0] < x[1]}
puts arr * ","

"නපුරු" විකෘති:

  • ඇත්ත වශයෙන්ම සැබවින්ම සැබවින්ම සැබවින්ම සැබවින්ම සැබවින්ම සෙමින් ධාවනය වේ
  • නූල් සංසන්දනය භාවිතා කරයි, එබැවින් 10 2 ට වඩා අඩුය .map &:to_f. දෙවන පේළියට එකතු කිරීමෙන් පහසුවෙන් සවි කළ හැකිය , නමුත් OP එය නොදැන සිටිය හැකිය
  • භාවිතා නොකිරීම chompනිසා අවසාන අංකයට අද්භූත නව රේඛාවක් අවසානයේ ඇත
  • භාවිතා කර නොමැති strip(. හිටපු දී අවකාශය එසේ නොමැති කොමා පමණ පරතරය සමඟ ආදාන නම් අංක පමණ අභිරහස් whitespace වේ 1.5, 2)

හෝ, ආකාරය ගැන විසින් bogosorting පරිශීලක ආදාන ?! >: ඩී

print "Input array of doubles, separated by commas: "
arr = gets.split(",")
arr.shuffle! until arr.each_cons(2).all? {|x|
    print "Is #{x[0]} less than #{x[1]}? (y/n) "
    gets =~ /y/
}
puts arr * ","

බොගොබොගොසෝර්ට් නැත්තේ ඇයි ? (O (n * (n!) time n) වේලාවක ධාවනය වේ)
wchargin

Cha චාර්ජින් මම එය සලකා බැලිය හැකිය :-) ඔබ මගේ මෑත සංස්කරණය ගැන උනන්දු විය හැකිය! (මන්දගාමී වීම ගැන කණගාටුයි, මට පරිගණකයක් වෙත පිවිසිය නොහැකි බැවින් මම දැන් මගේ දුරකථනයේ සිටිමි :-P)
දොරක්නොබ්

37

COBOL

ෂුවර්! "වඳුරෙකුට පවා මෙය කළ හැකිය!"

මෙන්න ඔබ සඳහා ආදානය වර්ග කරන සරල COBOL වැඩසටහනකි . එය කෙතරම් සුළු හා විස්තීරණ දැයි බැලීමට අදහස් කියවන්න. මෙහි සැබෑ වාසි වන්නේ එය උත්සාහ කර සත්‍ය යාන්ත්‍රණයක් වීමයි, එය ජාවා වැනි නව හා සාපේක්ෂව පරීක්ෂා නොකළ භාෂාවන් සහ වෙබ් පදනම් කරගත් හෝ මයික්‍රොසොෆ්ට් වෙතින් කිසිවක් රඳා නොපවතී. එය සැබවින්ම effectively ලදායී ලෙස සම්පාදනය කරන අතර, මෙවැනි ක්‍රියා පටිපාටි ෆෝචූන් 500 හි වඩාත්ම සාර්ථක මූල්‍ය සමාගම් සහ අනෙකුත් කර්මාන්ත නායකයින් විසින් භාවිතා කරනු ලැබේ. මෙම කේතය බොහෝ විශේෂ experts යින් විසින් සමාලෝචනය කර ඇති අතර එය වර්ග කිරීම සඳහා විශිෂ්ට යාන්ත්‍රණයක් ලෙස පිළිගැනේ.

000100 IDENTIFICATION DIVISION.
000200* Cobol sort. Consistent with COBOL 390
000300* does not use sections; does not use go to
000400* uses sort procedures
000500* does a sort with some minimal input validation
000600* since everything is done in an orderly way,
000700* you can easily add code of your own to this program
000800 PROGRAM-ID. 'SORTEX1'.
000900 ENVIRONMENT DIVISION.
001000 CONFIGURATION SECTION.
001100 INPUT-OUTPUT SECTION.
001200 FILE-CONTROL.
001300*    INPUT FILE UNSORTED
001400     SELECT UNSORTED-FILE ASSIGN UNSORTED.
001500*    The work file for the sort utility
001600*    you need the select and an sd but do not need jcl for it
001700     SELECT SORT-WORK      ASSIGN      SORTWORK.
001800*    output file normally a disk/tape file
001900*    for this program, send it to the printer
002000     SELECT SORTED-FILE ASSIGN SORTED.
002100*
002200 DATA DIVISION.
002300 FILE SECTION.
002400*
002500 FD  UNSORTED-FILE
002600     RECORDING MODE IS F
002900     RECORD CONTAINS  80 CHARACTERS.
003000
003100 01  UNSORTED-RECORD.
003200     05  WS-UR-ACCT-NO        PIC X(5).
003300     05  FILLER               PIC X(5).
003400     05  WS-UR-AMOUNT         PIC 9(5).
003500     05  WS-UR-CUST-NAME      PIC X(10).
003600     05  FILLER               PIC X(5).
003700     05  WS-UR-TRANS-CODE     PIC X(1).
003800     05  FILLER               PIC X(49).
003900
004000  SD  SORT-WORK
004400      RECORD CONTAINS  80 CHARACTERS.
004500*
004600 01  SORT-WORK-RECORD.
004700*    You need a definition and picture for
004800*    the field that is sorted on (sort key)
004900     05  SW-ACCT-NO    PIC X(05).
005000*    YOU NEED A FILLER TO COMPLETE THE DEFINITION
005100     05  FILLER        PIC X(75).
005200*
005300 FD  SORTED-FILE
005400     RECORDING MODE IS F
005700     RECORD CONTAINS  80 CHARACTERS.
005800*
005900 01  SORTED-RECORD.
006000     05  WS-SR-ACCT-NO        PIC X(05).
006100     05  FILLER               PIC X(05).
006200     05  WS-SR-AMOUNT         PIC 9(05).
006300     05  WS-SR-CUST-NAME      PIC X(10).
006400     05  FILLER               PIC X(55).
006500
006600 WORKING-STORAGE SECTION.
006700 01  SWITCHES.
006800     05  UNSORTED-FILE-AT-END      PIC X   VALUE 'N'.
006900     05  SORT-WORK-AT-END          PIC X   VALUE 'N'.
007000     05  valid-sw                  PIC X   VALUE 'N'.
007100
007200 01  COUNTERS.
007300      05 RELEASED-COUNTER PIC S9(7)
007400                PACKED-DECIMAL VALUE +0.
007500      05 REJECT-COUNTER   PIC S9(7)
007600                PACKED-DECIMAL VALUE +0.
007700
007800 PROCEDURE DIVISION.
007900     PERFORM INITIALIZATION
008000*    Compare this logic to that of the simple program
008100*    notice how the sort verb replaces the
008200*    perform main until end of file etc
008300     SORT SORT-work ASCENDING KEY SW-ACCT-NO
008400         INPUT PROCEDURE SORT-INPUT
008500         OUTPUT PROCEDURE SORT-OUTPUT
008600     PERFORM      TERMINATION
008700     GOBACK.
008800
008900 INITIALIZATION.
009000*    Do what you normally do in initialization
009100*    open the regular input file (not the sort work file)
009200*    and other files needed
009300*    (you could open them in the sort input procedure, too)
009400     OPEN INPUT UNSORTED-FILE
009500          output SORTED-FILE
009600*    READ THE FIRST RECORD ON THE REGULAR INPUT FILE
009700     PERFORM READ-IT.
009800*    Whatever else you do in initialization
009900*    headers, initialize counters, etc
010000
010100 TERMINATION.
010200*    Do what you normally do in termination
010300*    print out total lines
010400*    close the files you opened
010500*    display totals
010600     CLOSE UNSORTED-FILE
010700           SORTED-FILE.
010800
010900 READ-IT.
011000     READ UNSORTED-FILE
011100     AT END MOVE 'Y' TO UNSORTED-FILE-AT-END
011200     END-READ.
011300
011400 SORT-INPUT.
011500*    This is the 'sort input procedure'
011600*    when control passes thru the last statement in it
011700*    the input phase of the sort is finished
011800*    and actual sorting takes place
011900     PERFORM SORT-INPUT-PROCESS-ALL
012000        UNTIL UNSORTED-FILE-AT-END = 'Y'.
012100
012200  SORT-INPUT-PROCESS-ALL.
012300*  This is the point when you have each unsorted input record
012400*  in your hands
012500*  many programs do some validation or selection here
012600*  to determine which records are actually given to the sort util
012700*  we will do some simple validation here
012800     MOVE 'Y' TO VALID-SW
012900     PERFORM SORT-INPUT-VALIDATE
013000     IF VALID-SW = 'Y'
013100     THEN
013200**       Give the unsorted input record to the sort utility
013300         RELEASE SORT-work-RECord FROM unsorted-RECORD
013400         ADD 1 TO RELEASED-COUNTER
013500     ELSE
013600**       Here, you have decided not to give the unsorted input
013700**       record to the sort utility
013800         ADD 1 TO REJECT-COUNTER
013900     END-IF
014000     PERFORM READ-IT.
014100
014200 SORT-INPUT-VALIDATE.
014300*    Check the regular input record for validity.
014400*    if it is not suitable for sorting, set the valid sw
014500*    other validation criteria would apply for other files
014600     IF WS-UR-ACCT-NO IS equal to spaces
014700        THEN MOVE 'N' TO VALID-SW
014800     END-IF.
014900
015000 SORT-OUTPUT.
015100*    This is the 'sort output procedure'
015200*    when control passes thru the last statement in it
015300*    the output phase of the sort is finished
015400*    you have seen (returned) the last sorted record
015500*    and the sort utility is finished
015600     PERFORM RETURN-IT
015700     PERFORM SORT-OUTPUT-PROCESS-ALL
015800         UNTIL SORT-WORK-AT-END = 'Y'.
015900
016000 RETURN-IT.
016100*    Gets each sorted record from the sort utility
016200*    return is logically like a read
016300      RETURN SORT-work
016400         AT END MOVE 'Y' TO SORT-work-AT-END
016500      END-RETURN.
016600
016700 SORT-OUTPUT-PROCESS-ALL.
016800      PERFORM SORT-OUTPUT-PROCESSING
016900      PERFORM RETURN-IT.
017100 SORT-OUTPUT-PROCESSING.
017200* Here you do the things you do in a
017300* regular program's main processing routine
017400* add totals, compute things
017500* write detail records, print lines, etc
017600* you could put control break check here
017700* this program just and writes the record out to "sorted file"
017900     MOVE SORT-WORK-RECORD TO SORTED-RECORD
018100     WRITE SORTED-RECORD.

6
මෙම ප්‍රශ්නයට පිළිතුරක් සඳහා ඔබ පමණක් COBOL භාවිතා කරයි. +1
syb0rg

5
අහ්, පන්ච් කාඩ් වල නැවුම් සුවඳ
Sklivvz

3
BEbenezerSklivvze - LOL. මගේ එක්රැස්වීම් විද්‍යාලයේ මහාචාර්යවරයා පැරණි පන්ච් කාඩ්පත් ගැන පන්තියට පවසන විට මම වරක් පොත් සලකුණක් ලෙස භාවිතා කළ පන්ච් කාඩ්පතක් එළියට ගත්තෙමි. ඔහු ප්‍රමාණවත් ලෙස තට්ටු කරන ලදී (එය 1994 දී විය :). මගේ සමකාලීනයන් බොහෝ දෙනෙක් මුළු තට්ටුවක්ම දැක ඇතැයි නොසිතන්න ...
DVK

30

OP කිසි විටෙකත් ඒවා වර්ග කරන්නේ කෙසේදැයි කීවේ නැත ... නැතහොත් ඔහු යුගල පිළිබඳ අර්ථ දැක්වීම කුමක්ද? දත්ත සමුදාය උපකල්පනය කර doubleඑය අනුපිටපත් ලෙස අර්ථ නිරූපණය කිරීම . ජාවාස්ක්‍රිප්ට් භාවිතා කිරීම.

var arr = [4, 6, 7, 4, 5, 9, 11, 7],
    flag = 1,
    result = [];

while( arr.length ) {
  for( var i = 0, index = 0; i < arr.length; ++i ) {
    if( arr[i] * flag < arr[index] * flag ) {
      console.log(arr[i], arr[index]);
      index = i;
    }
  }
  arr.splice(index, 1);
  flag = -flag;
}

ප්‍රති ult ලය: ප්‍රත්‍යාවර්ත අනුපිළිවෙල [4, 11, 4, 9, 5, 7, 6, 7]


4
"දත්ත සමුදාය ද්විත්ව යැයි උපකල්පනය කිරීම නමුත් එය අනුපිටපත් ලෙස අර්ථ නිරූපණය කිරීම". එසේ සිතන්නේ සැබෑ බුද්ධිමතෙකු පමණි. යන්තම් දීප්තිමත්!
ෆෙලිපේ මියෝසෝ

ElFelipeMiosso ඇත්තම කිව්වොත්, ඔබ උපහාසාත්මකද කියා මට විශ්වාස නෑ ...
කිරූස්

1
හාහා ... මම උපහාසයට ලක්වුණා. මම දන්නවා එතන ඇත්තටම එහෙම හිතන අය ඉන්නවා. කෙසේ හෝ වේවා ... ඔබේ පිළිතුර වීර කාව්‍යයකි! මම ගොඩක් හිනා වුණා.
ෆෙලිපේ මියෝසෝ

ElFelipeMiosso සතුටුයි මට හිනා වෙන්න උදව් කරන්න. ;)
කිරූස්


28

PHP

දෝෂ හැසිරවීම සමඟ සම්පූර්ණ ක්‍රියාත්මක කිරීම මෙන්න. එය ඕනෑම කෙනෙකුට වේගවත්ම වේ array of doubles.

<?php
  function arraySorter($arr) {
      foreach ($arr as $el) {
          if ($el != 'double') {
              throw new Exception('Unexpected Error: Invalid array!');
          }
      }
      return $arr;
  }

  $arrayOfDoubles = Array('double', 'double', 'double', 'double', 'double');
  var_dump(arraySorter($arrayOfDoubles));
?>

25
do
{
}
while(next_permutation(begin(ar), end(ar)));

C ++ හි ඊළඟ ප්‍රේරණය ක්‍රියාත්මක වන්නේ අරාව වර්ග කර ඇති විට සත්‍ය ලෙස නැවත පැමිණීම සහ වෙනත් ආකාරයකින් අසත්‍යය (එය අවසර දුන් පසු) ය. එබැවින් ඔබ අරාව වර්ග කර ඉහත පරිදි කළ යුතු වේලාවක එය භාවිතා කළ යුතුය (එබැවින් එය සම්පූර්ණ කවයක් නැවත වර්ග කළ අරාව වෙත ගෙන යනු ඇත).


+1 next_permutationමගේ පිළිතුර සඳහා භාවිතා කිරීම ගැන මම සිතුවෙමි , නමුත් මෙය මගේ මතකයේ තිබූ දෙයට වඩා පිරිසිදු ය.
jliv902

25

[නිරවද්‍ය වැරදි මඟ පෙන්වීමෙන් විසඳුම]

කරුණාකර අදාළ ප්‍රමිතිය කියවන්න, IEC 60559: 1989 ඔබට මෙහි මිලදී ගත හැකි මයික්‍රොප්‍රොසෙසර් පද්ධති සඳහා ද්විමය පාවෙන ලක්ෂ්‍ය අංක ගණිතය සඳහා පිරිවිතර . Or5.10 දක්වා වූ පාදසටහනෙහි, සමස්ත ඕර්ඩර් අනාවැකි පිළිබඳ විස්තර , පහත පරිදි වේ:

totalOrder ආකෘතියකින් සියලුම කේතන ක්‍රම සඳහා සම්පූර්ණ ඇණවුමක් පනවන්නේ නැත. විශේෂයෙන්, එකම පාවෙන ලක්ෂ්‍ය නිරූපණයේ විවිධ කේතන ක්‍රම අතර වෙනස හඳුනා නොගනී, එක් හෝ දෙකම කේතන ක්‍රම කැනොනිකල් නොවන විට.

මේ අනුව, ද්විත්ව වර්ග කිරීම සඳහා කේත ලිවිය නොහැකි බව අපට පෙනේ. එය උපක්‍රමශීලී ප්‍රශ්නයකි. හා, හා, ඉතා දක්ෂයි! කරුණාකර ඔබේ මහාචාර්යවරයාට කියන්න මම ඔහුගේ පා ​​course මාලාව ඉතා සතුටින් භුක්ති විඳිනවා.

[සංස්කරණය: කිසිවක් මට අවශ්ය නැත ගැටලුව සමස්ත අනුපිළිවෙල ඉල්ලා බව උපකල්පනය කිරීමට]


3
නමුත් ගැටලුව වූයේ යුගල වශයෙන් වර්ග කිරීමයි. අගයන් (සම්පූර්ණ) පිළිවෙලට තිබිය යුතු යැයි කිසිවෙකුට අවශ්‍ය නොවීය. උදාහරණයක් ලෙස ඔබට අරාව ධනාත්මක හා negative ණ සංඛ්‍යා දෙකකට බෙදිය හැකිය. ප්‍රශ්නය ඔබ දෙගුණ තෙගුණ කර ඇත.
ෂියෝනා

23

නපුරු ජාවාස්ක්‍රිප්ට්:

OP, මට ඔබට සෑම දෙයක්ම ලබා දීමට අවශ්‍ය නැත, එබැවින් මම ඔබට තනිවම පරිශීලකයාගෙන් ආදානය ලබා ගන්නේ කෙසේදැයි සොයා ගැනීමට ඉඩ දෙන්නෙමි (ඉඟිය: භාවිතය prompt).

ඔබට එය ලැබුණු පසු, මෙන්න ඔබේ ශ්‍රිතය එය වර්ග කිරීම සඳහා යොමු කළ හැකිය. ඔබට අවශ්‍ය වන්නේ අරාව, අරාවෙහි අඩුම අගය සහ වර්ධකයක් සැපයීමයි:

var sortDoubles = function (unsortedArray, minimumVal, increment) {
    var sortedArray = [];

    while (unsortedArray.length != sortedArray.length) {
        var index = unsortedArray.indexOf(minimumVal);
        if (index != -1) {
            sortedArray.push(unsortedArray[index]);
        }

        minimumVal += increment;
    }

    return sortedArray;
};

පරිශීලක ආදානය [1.5, -3.5, 12, 10, -19.5] සමඟ එය ක්‍රියාකාරීව දැකීමට මෙන්න.


සටහන: දුර්වල ක්‍රියාකාරිත්වය, සංකීර්ණ හා අත ළඟ ඇති ගැටලුව සඳහා පැහැදිලි කළ නොහැකි වීම හැරුණු විට, පාවෙන ලක්ෂ්‍ය ගණිතය ගැන OP නොදන්නේ නම් මෙය විශේෂයෙන් කලකිරීමට පත් වනු ඇත. උදාහරණයක් ලෙස, පරිශීලක ආදානය [8.1, 5, -.8, 2.3, 5.6, 17.9]සහ OP සෘජු අගයන් (එනම් minimumVal=-.8සහ increment=.1) තෝරා ගන්නේ නම් , වැඩසටහන සදහටම ක්‍රියාත්මක වේ. අදාළ සටහනක් මත, මෙම ගැටලුව නිසා දැනට ක්‍රියාත්මක නොවන බ්‍රව්සර් ටැබ් 2 ක ආඩම්බර හිමිකරු මම වෙමි :)

සටහන II: ඉහත කේතය ලිවීම පවා මට පිළිකුලක් විය.

සටහන III: MWA හහාහා!


හොඳ අදහසක්. ඔබ තවමත් ක්‍රමලේඛන නවකයකු වන විට ඔබ සිසිල් වන්නට ඇත.
පියරේ අර්ලෝඩ්

22

මෙන්න මම ජාවා සඳහා කැමති සත්‍ය පිළිතුරක් :

Println ට පෙර රේඛාව එක් කරන්න, එවිට ඔබේ අරාව වර්ග කර ඇත

Arrays.sort( array );

පැහැදිලි කිරීමක් නැත, OP ව්‍යාකූල කරයි , නමුත් ක්‍රියා කරන අතර වඩාත් පළපුරුදු ක්‍රමලේඛකයින්ගෙන් ඉහළට එනු ඇත.


තවත් සමාන පිළිතුරක් :

Arrays.sort () දෙස බලන්න

වක්‍රව OP ට නොපැහැදිලි නිවැරදි පිළිතුරක් ලබා දෙමින් තමාගේම පර්යේෂණයක් කිරීමට පවසන්න. වැඩිදුර පර්යේෂණ නොමැතිව OP තවමත් ව්‍යාකූල වී ඇත. සබැඳිය පැරණි ලියකියවිලි වෙත යොමු වීමට මම කැමතියි.


10
මෙය ප්‍රයෝජනවත් වන අතර එමඟින් ඡන්දය ප්‍රකාශ කිරීම වටී.
emory

11
"නොපැහැදිලි නිවැරදි පිළිතුරක් ලබා දෙමින් OP හට තමාගේම පර්යේෂණයක් කරන ලෙස වක්‍රව පැවසීම" මගේ ස්ටැක් ඕවර්ෆ්ලෝ පිළිතුරු විලාසය විස්තර කරයි: /
කොරී ගෝල්ඩ්බර්ග්

7
"Arrays.sort () දෙස බලන්න" ... "මගේ වැඩසටහනේ එය භාවිතා කරන්නේ කෙසේදැයි මට උදාහරණයක් ලබා ගත හැකිද?" ... දීප්තිමත්.
සයිමන්ට්

5
+1 විශේෂයෙන් අපගේ නිහතමානී OP හට පංතියක් සඳහා ඔහු / ඇය වර්ග කිරීම ලිවිය යුතු නිසා Array.sort () ඔහුට / ඇයට සම්පූර්ණයෙන්ම නිෂ් less ල වේ.
කෙවින්

2
Ctrl + F -> "මගේ වැඩසටහනේ එය භාවිතා කරන්නේ කෙසේදැයි මට උදාහරණයක් ලබා ගත හැකිද?" = 3 ප්‍රති .ල.
ක්වික්ස් - මොනිකා

21

ජාවා හි වර්ග කිරීමේ ගැටළුව සඳහා ජානමය ඇල්ගොරිතම / මොන්ටේ කාලෝ ක්‍රමය

වර්ග කිරීමේ ගැටළුව දීර් science කාලයක් තිස්සේ විද්‍යාව ගණනය කිරීම සඳහා දන්නා අතර බොහෝ හොඳ විසඳුම් සොයාගෙන ඇත. මෑත වසරවලදී ජෛව පරිගණකකරණයේ විශාල දියුණුවක් ඇති අතර ජීව විද්‍යාව මගින් ගැටලු විසඳන්නේ කෙසේද යන්න සොයා බැලීම දුෂ්කර ගැටළු විසඳීමට බෙහෙවින් ඉවහල් වේ. මෙම වර්ග කිරීමේ ඇල්ගොරිතම මෙම අදහස් වලින් හොඳම දේ වන්නේ වර්ග කිරීමේ ගැටළුව විසඳීම සඳහා ඒවා භාවිතා කිරීමයි. අදහස හරිම සරලයි. ඔබ ඇණවුම් නොකළ අරාවකින් ආරම්භ කර මෙය දැනටමත් වර්ග කර ඇති ආකාරය සොයා ගන්න. ඔබ එයට එහි “වර්ග කිරීම” පිළිබඳ ලකුණු ලබා දී අහඹු ලෙස සං component ටකයක් සමඟ අරාව වෙනස් කරන්න - ජීව විද්‍යාවේ දී මෙන්, ඔබ දෙමව්පියන් ගැන සියල්ල දැන සිටියත් ළමයින්ගේ පෙනුම කෙබඳුදැයි පැහැදිලි නැත! මෙය ජානමය ඇල්ගොරිතම කොටසයි. කීමට ඔබ එම අරාවෙහි දරුවන් නිර්මාණය කරයි. එවිට දෙමව්පියන්ට වඩා දරුවන් වඩා හොඳින් වර්ග කර තිබේදැයි ඔබට පෙනේ (සුදුසුම අයගේ පැවැත්ම!). මෙය එසේ නම්, ඔබ මෙම නව අරාව සමඟ ඊළඟ ප්‍රේරණය තැනීම සඳහා ආරම්භක ලක්ෂ්‍යය ලෙස ඉදිරියට යන අතර අරාව සම්පුර්ණයෙන්ම වර්ග කරන තෙක් ඉදිරියට යන්න. මෙම ප්‍රවේශයේ ඇති සිසිල්ම දෙය නම් අරාව දැනටමත් ආරම්භයේ සිට මඳක් වර්ග කර ඇත්නම් එය කෙටි වේ!

package testing;

import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

import org.joda.time.DateTime;
import org.joda.time.Interval;


public class MonteCarloSort {
    private static final Random RANDOM  = new Random();


    public static void main(String[] args) {


        List doubleList = new java.awt.List();

        //  prompt the user to enter numbers
        System.out.print("Enter a number or hit return to start sorting them!");


        //  open up standard input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String input = null;

        //  read the numbers from the command-line; need to use try/catch !!!
        do{

            try {
                input = br.readLine();
            } catch (IOException ioe) {
                System.out.println("IO error trying to read a number!");
                System.exit(1);
            }


                try {
                    double d = Double.parseDouble(input);
                    doubleList.add(input);
                } catch (NumberFormatException e) {
                    if (!input.equals("")) System.out.println("Only numbers are allowed.");
                }

        } while (!input.equals(""));



        printCurrentListAndStuff(doubleList);

        while (isAscSorted(doubleList) < doubleList.getItemCount()){
            List newlist = createPermutation(doubleList);

            //genetic algorithm approach!
            if (isAscSorted(doubleList) <= isAscSorted(newlist)){
                //the new list is better, so we use it as starting point for the next iteration!
                doubleList = newlist;
                printCurrentListAndStuff(doubleList);

            }

        }

        System.out.println("done!");
    }

    private static void printCurrentListAndStuff(List doubleList){
        System.out.print("array sortedness is now " + isAscSorted(doubleList) + "(max = "+doubleList.getItemCount()+"): ");
        printList(doubleList);
        System.out.print("\n"); 
    }

    private static void printList(List doubleList){
        for (int i = 0; i < doubleList.getItemCount(); i++){
            String doubleVal = doubleList.getItem(i);
            System.out.print((i>0?", ":"") +doubleVal);
        }   
    }

    private static List createPermutation(List doubleList){
        int sortedness = isAscSorted(doubleList);
        if (sortedness == doubleList.getItemCount()) return doubleList;

        //we take the first non fitting item and exchange it by random
        int swapWith = RANDOM.nextInt(doubleList.getItemCount());

        //it makes no sense to swap with itself, so we exclude this
        while (swapWith == sortedness){
            swapWith = RANDOM.nextInt(doubleList.getItemCount());
        }

        List newList = new List();
        for (int i = 0; i < doubleList.getItemCount(); i++){
            if ( i == sortedness){
                newList.add(doubleList.getItem(swapWith));  
            }
            else if ( i == swapWith){
                newList.add(doubleList.getItem(sortedness));    
            }
            else{
                newList.add(doubleList.getItem(i));
            }

        }
        return newList;

    }

    /**
     * A clever method to get the "degree of sortedness" form a given array. the
     * bigger the number the more sorted it is. The given list is fully sorted if
     * the return value is the length of the list!
     * 
     * @param doubleList
     * @return a number
     */
    private static int isAscSorted(List doubleList){
        double current = Double.NEGATIVE_INFINITY;
        for (int i = 0; i < doubleList.getItemCount(); i++){
            String doubleVal = doubleList.getItem(i);
            if (Double.parseDouble(doubleVal) >= current){
                current = Double.parseDouble(doubleVal);
            }
            else{
                return i;
            }
        }
        return doubleList.getItemCount();
    }

}

අමතර

  • Java.awt.List අනිසි ලෙස භාවිතා කිරීම
  • නොගැලපෙන සහ නරක විචල්‍ය නම් කිරීම
  • ජෛව සම්පාදනය පිළිබඳ සම්පුර්ණයෙන්ම ගොන් කතා
  • පැහැදිලි කිරීමේදී නව නිපැයුම් හා නොගැලපෙන භාෂාව
  • මොන්ටේ කාලෝ යනු සෘජු ඉදිරි නිර්ණායක ගැටලු සඳහා වැරදි මෙවලමකි
  • අනවශ්‍ය ආනයන
  • තවත් හොඳ දේවල් ...

මෙම දිසාපතිවරයා හෝ මොන්ටේ කාලෝ ඇමතීම තවත් ට්‍රොල් මට්ටමක්ද? මෙය අහඹු ලෙස කඳු නැගීමේ ඇල්ගොරිතමයක් යැයි මම විශ්වාස කරමි.
ෂියෝනා

buzzword නම් සමග මෙම වැඩසටහන ඇසුරු හිතාමතාමද, නමුත් මම "අහමුෙලන කඳු කඳු තරණය ඇල්ගොරිතමය" අසා හෝ කවදාවත් ... මම පුලුල් අර්ථයෙන් ජී හා මොන්ටි කාලෝ ඉතා පැහැදිලිව පවසන්නේ, වැරදි වීමට, ලකුණු ඕනෑවට වඩා දුර නැත කියලා ...
luksch

19

පයිතන්

a = map(float, raw_input().split())
print sorted(a, key=lambda x: int(x * 10**3) % 10 + int(x * 10**5) % 10)

3 එකතුව විසින් අරාව (ලැයිස්තුව) ආකාරයේ වැනි හා 5 වැනි දශමස්ථානය.


5
අවාසනාවකට මෙන්, මෙය සුළු වශයෙන් සවි කර ඇත්තේ පසුව සියල්ල ඉවත් කර lambda x:එය ප්‍රතිස්ථාපනය කිරීමෙනි x. එහෙත්, ආරම්භක කෝඩරයක් එය කිසි විටෙකත් නොදැන සිටියි, එබැවින් කුඩෝස්!
ජෝ ඉසෙඩ්

18

සී ++

මෙය ක්‍රියාත්මක වේ ... අවසානයේ.

මෙන්න මගේ වර්ග කිරීමේ ඇල්ගොරිතම:

template <typename Iterator>
void sort (Iterator first, Iterator last)
{
    while (std::is_sorted (first, last) == false) {
        std::shuffle (first, last, std::random_device()) ;
    }
}

සම්පූර්ණ වැඩසටහන මෙන්න:

#include <algorithm>
#include <iostream>
#include <random>
#include <string>
#include <sstream>
#include <vector>

namespace professional 
{
    template <typename Iterator>
    void sort (Iterator first, Iterator last) ;

} // end of namespace professional

std::vector <double> get_doubles () ;

int main (void)
{
    std::vector <double> vecVals = get_doubles () ;
    professional::sort (std::begin (vecVals), std::end (vecVals)) ;

    for (const double d : vecVals) {
        std::cout << d << " " ;
    }

    std::cout << std::endl ;

    return 0 ;
}

template <typename Iterator>
void professional::sort (Iterator first, Iterator last)
{
    while (std::is_sorted (first, last) == false) {
        std::shuffle (first, last, std::random_device()) ;
    }
}

std::vector <double> get_doubles ()
{
    std::cout << "Please enter some space delimited doubles." << std::endl ;

    std::vector <double> vecVals ;

    std::string strLine ;
    std::getline (std::cin, strLine) ;

    std::stringstream ss (strLine) ;

    while (1) {
        double d = 0 ;
        ss >> d ;

        if (ss.bad () == false && ss.fail () == false) {
            vecVals.push_back (d) ;
        }

        else {
            break ;
        }
    }

    return vecVals ;
}

6
ඔබේ වර්ගීකරණ “ඇල්ගොරිතම” මට කඳුළු සලන්නට විය.
Nate

හාහ්, එය ඇල්ගොරිතමයක් නොවේ, මන්ද එය අවසන් කිරීමට අවසර ලබා දී නොමැත>: D
jmacedo

@ ජොක්ස්නාස්, ඇත්ත වශයෙන්ම නිර්ණය නොකරන සසම්භාවී උපාංග නොමැති පද්ධති වල, සසම්භාවීකාරකය ඇත්ත වශයෙන්ම ආවර්තිතා විය හැකිය. එවිට එය සරලවම රඳා පවතින්නේ සසම්භාවීකරුවා විසින් අවසර දී ඇති විය හැකි ප්‍රේරණයන් සමූහය හැකි සියලු ප්‍රේරක කට්ටල ues S_n sub ලබා ගත හැකි ද යන්න මත ය.
දෝෂය

කලිසම්, මට අමතක වුනා LaTeX සඳහා සහය දැක්වූයේ TeX.SE සහ Math.SE. එම සංකේත ස්නූටි ඇල අකුරු වලින් මවා ගන්න.
දෝෂය

18

මෙන්න, ඔබේ ඇස් මංගල්යය:

<?php
if (isset($_POST["doubleArray"]) === true) {
    $doubleValues = explode(":", $_POST["doubleArray"]);
    if (is_numeric($_POST["smallestDouble"]))
    {
        $sorted = $_POST["sorted"] . ":" . $doubleValues[$_POST["smallestDouble"]];
        unset($doubleValues[$_POST["smallestDouble"]]);
        $doubleValues = array_values($doubleValues);        
    }

    if (count($doubleValues) > 0) {
        $i = 0;
        foreach ($doubleValues as $value) {
            echo $i . " : " . $value . "<br />";
            $i++;
        }
        echo "Type the index of the smallest double value in the list: ";
    } else {
        echo "Sorted values" . $sorted;
    }
}else {
       echo "Enter double values separated by a colon (:)";

}
?>

<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
<?php
if (!isset($doubleValues)) {
    echo '<input type="text" name="doubleArray" /><br>';
} else {
    echo '<input type="hidden" name="doubleArray" value="' .
    implode(":", $doubleValues) .
    '" ><input type="text" name="smallestDouble" /><br>'.
    '<input type="hidden" name="sorted" value="' . $sorted . '" >';
}
?>
    <input type="submit" value="Submit">
</form>

මෙම කේත කැබැල්ල අරාව පෙන්වන අතර අරාවෙහි කුඩාම ද්විත්වයට ඇතුළු වන ලෙස පරිශීලකයාගෙන් ඉල්ලා සිටී. ඉන්පසු එය වර්ග කළ අංක ලැයිස්තුවට අංකය එකතු කරයි, අරාවෙන් දෙගුණයක් ඉවත් කර ඉතිරි අරාව අංක පෙන්වයි.

වැරදි අර්ථකථනය: දුර්වල ලක්ෂ්‍යය, නමුත් වර්ග කිරීම සඳහා පරිශීලකයාගෙන් ඉල්ලීම OP විසින් හරියටම අපේක්ෂා නොකරයි.

* වංචා කිරීම: සත්‍ය වර්ග කිරීම සිදු කරන්නේ පරිශීලකයා ය.

* කාර්ය සාධනය: සෑම අරාවකටම සේවාදායක වට රවුමක් අවශ්‍ය වන අතර, පරිශීලකයාට කුඩාම අංකය අතින් සොයා ගැනීම අවශ්‍ය වේ. කාර්ය සාධනය වඩාත් නරක අතට හැරවිය නොහැක.

* පිළිගත නොහැකිය: මම හිතන්නේ මම එය ආවරණය කළා. එය නැවත භාවිතා කිරීමට වාසනාව. නරකම දෙය නම්, පරිශීලකයාට කේතයෙන් 90% ක් ඉවත් කර කුඩාම අගයන් සොයා ගැනීමට පුනරාවර්තනය කිරීමෙන් සහ සෑම අවස්ථාවකදීම ඒවා ඉවත් කිරීම මඟින් ඔහුට අවම කාර්යක්ෂම වර්ග කිරීමේ ඇල්ගොරිතමයක් ලබා දෙනු ඇත.

නිර්මාණාත්මක හා නපුර: ඔබ මට කියන්න.


2
ඔබ 'ඔබේ ඇස්
සාදන්න

3
“නපුර” යනු අවශ්‍යතාවන්ගේ කොටසකි, එසේ නොවේ ද?
සිල්වර්ඩ්‍රැග්

17

Javascript බුද්ධිමත් නිර්මාණ වර්ග කිරීම

function sort(array){
    console.log("Someone more intelligent than you has already sorted this optimally. Your puny brain cannot comprehend it");
    return array;//I do believe that this is the fastest sorting algorithm there is!
}

6
ණය ගෙවිය යුතු ණය: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
ක්‍රමලේඛන තරඟයකදී ඔබ බුද්ධිමත් නිර්මාණවලට පහර දෙන්නේ මන්දැයි තේරෙන්නේ නැද්ද?
කෙබී

12
hekhebbie ඇයි නැත්තේ?
කොන්රාඩ් රුඩොල්ෆ්

ගැටලුව නම්, පරිශීලකයා සංඛ්‍යා ඇතුළත් කරන්නේ නම්, ඔවුන් තමන්ට වඩා බුද්ධිමත් වනු ඇත. ;)
d -_- b

16

පයිතන් - req. # 1

මෙම කේතය සංඛ්‍යාත්මක අනුපිළිවෙල වැඩි කරනවාට වඩා දෙගුණයක් ශබ්දකෝෂ අනුපිළිවෙලට වර්ග කරනු ඇත, ඉලක්කම් උපසර්ග ගසක් නිර්මාණය කර ඒවා හරහා පුනරාවර්තනය වේ.

class trie_node:
    def __init__(self):    
        self.chn = {}
        self.instances = 0
        for char in "0123456789.-+e":
            self.chn[char] = None
    def insert_number(self, number):
        if(number == ""):
            self.instances += 1
        else:
            self.chn[number[0]] = trie_node()
            self.chn[number[0]].insert_number(number[1:])

def get_sorted_array(node, number):
    array_to_return = [number] * node.instances
    for char in "0123456789.-+e":
        if node.chn[char] != None:
            array_to_return += get_sorted_array(node.chn[char], number + char)
    return array_to_return

def pcg_sort(arr):
    root = trie_node()

    for element in arr:
        root.insert_number(str(element))

    sarr = get_sorted_array(root, "")
    fsarr = []
    for element in sarr:
        fsarr.append(float(element))

    return fsarr

input_array = []

while True:
    number = raw_input("Enter a double (/ to end): ")
    if(number == "/"):
        print pcg_sort(input_array)
        break
    else:
        try:
            number = float(number)
            input_array.append(number)
        except ValueError:
            pass

එය n log nකාලයාගේ ඇවෑමෙන් ක්‍රියාත්මක වන අතර ඇත්ත වශයෙන්ම වර්ග කළ ලැයිස්තුවක් වෙනත් ආකාරයකින් තබා ගැනීමට හොඳ ක්‍රමයකි, නමුත් අවාසනාවකට OP සඳහා එය සම්පූර්ණයෙන්ම වැරදි දේ කරයි.


4
දශම ලක්ෂයට පෙර සියලු සංඛ්‍යා එකම ඉලක්කම් සංඛ්‍යාවක් තිබේ නම්, එය ඇත්ත වශයෙන්ම නිවැරදිව ක්‍රියා කරනු ඇත, එබැවින් ඔහු ආදානයක් භාවිතා කරමින් එය පරීක්‍ෂා කළ හොත්, යම් ආකාරයක වැරැද්දක් සිදුවන බව OP නොදැන සිටිය හැකිය. , කියන්න , 2, 1, 3, 8, 5.
ජෝ ඉසෙඩ්

14

යුගල පෙළ වර්ග කරයි. ජාවා හි:

public String sort(double[] input){
String s = "";
for(Double d:input){
    s+=Long.toBinaryString(Double.doubleToRawLongBits(d));
}
char[] chars=s.toCharArray();
Arrays.sort(chars);
s="";
for(char c:chars){
    s+=c;
}
return s;}

උදාහරණයක් වශයෙන්:

[0.0, 1.5, 123]

හි වර්ගීකරණය නොකළ ද්විමය නිරූපණයෙන් යයි

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

අලංකාර ලෙස වර්ග කර ඇත

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

මට අවශ්‍ය වන්නේ පරිශීලකයා ද්විත්ව පෙළක් ඇතුළත් කරන අතර වැඩසටහන මඟින් අරාව වර්ග කර ඇත. කරුණාකර ඔබට කේතය ලබා දිය හැකිද?

සෑම ලේඛකයෙකුටම සංස්කරණය කරන්න, බෙදීම පිළිගත හැකි යැයි පෙනෙන්නට අදහස් දැක්වීම වඩා හොඳ යැයි මම සිතමි. දී Rebol ...

doubled-list: load ask "Input list of doubles: "

;-- The list is of doubles, so we have to undouble them before sorting
;-- Use MAP-EACH to create a new list with each element divided by two
undoubled-list: map-each num doubled-list [num / 2] 

;-- Note: We could also have sorted before we undoubled the numbers
print sort undoubled-list

ඔවුන් ඇත්ත වශයෙන්ම ද්විත්ව යනු කුමක්දැයි නොදන්නා අතර, ද්විත්ව ලැයිස්තුවක් සංඛ්‍යා දෙකකින් ගුණ කළ හැකි යැයි විශ්වාස කළ හැකිය.


6
ආදානය දැනටමත් දෙගුණ වී ඇති බැවින් ඒවා අඩකින් අඩු කිරීමට අවශ්‍ය විය හැකිය!
kealist

alkalist මම එය සලකා බැලුවෙමි, කෙසේ වෙතත් මෙය "දෙගුණ කිරීම" සිදු වේ යන අදහස මත ක්‍රියාත්මක වේ. [2 * අංකය] තිබීම වඩා හොඳ යැයි මම සිතමි.
HostileFork පවසන්නේ SE

10

ප්‍රශ්නය හිතාමතාම වරදවා වටහා ගැනීම:

පුනරාවර්තන ප්‍රවේශයක් භාවිතා කිරීම:

def recsort(array):
    "Recursive sort"
    if array:
        for j, i in enumerate(array):
            for l1 in recsort(array[:j]):
                for l2 in recsort(array[j+1:]):
                    yield i + l1 + l2
                    yield i + l2 + l1
    else:
        yield ''

for p in recsort(raw_input("Array:")):
    print p

මෙම ප්‍රවේශය අතිශයින්ම නම්‍යශීලී වන පරිදි, අරාවෙහි ඇති ඕනෑම වර්ගයක දත්ත, ඕනෑම ආකාරයක වර්ග කිරීමේ අනුපිළිවෙලක් සහ ආදානය සඳහා ඕනෑම ආකාරයක බෙදුම්කරුවෙකු සඳහා පවා, වර්ග කළ අරාව යම් අවස්ථාවක ප්‍රතිදානය කිරීමට සහතික වේ. එහි ප්‍රධානම අඩුපාඩුව නම් එය විශාල අරා සඳහා ටිකක් මන්දගාමී වීමයි, නමුත් ඔබට එය බහු තෙරපුමෙන් පහසුවෙන් විසඳා ගත හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.