[{"data":1,"prerenderedAt":3058},["ShallowReactive",2],{"item-lessons-light-ch28-algorithms-searching-sorting-recursion":3,"item-examples-light-ch28-algorithms-searching-sorting-recursion":444,"item-exercises-light-ch28-algorithms-searching-sorting-recursion":753,"item-lesson-full-ch28-algorithms-searching-sorting-recursion-28.2":1070,"item-example-full-ch28-algorithms-searching-sorting-recursion-28.2":1590,"item-exercise-full-ch28-algorithms-searching-sorting-recursion-28.2":2200},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,304,308,312,316,320,324,328,332,336,340,344,348,352,356,360,364,368,372,376,380,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440],{"path":5,"title":6,"stem":7},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1-why-java-for-frc","Why Java for FRC?","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.1-why-java-for-frc",{"path":9,"title":10,"stem":11},"\u002Fshockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers","shockwave-curriculum\u002Flessons\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":13,"title":14,"stem":15},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":17,"title":18,"stem":19},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":21,"title":22,"stem":23},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":25,"title":26,"stem":27},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":29,"title":30,"stem":31},"\u002Fshockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators","shockwave-curriculum\u002Flessons\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":33,"title":34,"stem":35},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":37,"title":38,"stem":39},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":41,"title":42,"stem":43},"\u002Fshockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports","shockwave-curriculum\u002Flessons\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":45,"title":46,"stem":47},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":49,"title":50,"stem":51},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":53,"title":54,"stem":55},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":57,"title":58,"stem":59},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":61,"title":62,"stem":63},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":65,"title":66,"stem":67},"\u002Fshockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods","shockwave-curriculum\u002Flessons\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":69,"title":70,"stem":71},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","Control Structures: if Statements & For Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":73,"title":74,"stem":75},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":77,"title":78,"stem":79},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":81,"title":82,"stem":83},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":85,"title":86,"stem":87},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":89,"title":90,"stem":91},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":93,"title":94,"stem":95},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":97,"title":98,"stem":99},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":101,"title":102,"stem":103},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws)","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":105,"title":106,"stem":107},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F8-while-loops","While Loops","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.8-while-loops",{"path":109,"title":110,"stem":111},"\u002Fshockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms","shockwave-curriculum\u002Flessons\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":113,"title":114,"stem":115},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F1-strings","Strings","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.1-strings",{"path":117,"title":118,"stem":119},"\u002Fshockwave-curriculum\u002Flessons\u002Fch06-strings\u002F2-string-algorithms","String Algorithms","shockwave-curriculum\u002Flessons\u002Fch06-strings\u002F6.2-string-algorithms",{"path":121,"title":122,"stem":123},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","The Class Blueprint","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":125,"title":126,"stem":127},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":129,"title":130,"stem":131},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":133,"title":134,"stem":135},"\u002Fshockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods","shockwave-curriculum\u002Flessons\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":137,"title":138,"stem":139},"\u002Fshockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\"","shockwave-curriculum\u002Flessons\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":141,"title":142,"stem":143},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":145,"title":146,"stem":147},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":149,"title":150,"stem":151},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":153,"title":154,"stem":155},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":157,"title":158,"stem":159},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":161,"title":162,"stem":163},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":165,"title":166,"stem":167},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":169,"title":170,"stem":171},"\u002Fshockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files","shockwave-curriculum\u002Flessons\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":173,"title":174,"stem":175},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":177,"title":178,"stem":179},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":181,"title":182,"stem":183},"\u002Fshockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms","shockwave-curriculum\u002Flessons\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":185,"title":186,"stem":187},"\u002Fshockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices","shockwave-curriculum\u002Flessons\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":189,"title":190,"stem":191},"\u002Fshockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch","shockwave-curriculum\u002Flessons\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":193,"title":194,"stem":195},"\u002Fshockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas","shockwave-curriculum\u002Flessons\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":197,"title":198,"stem":199},"\u002Fshockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns?","shockwave-curriculum\u002Flessons\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":201,"title":202,"stem":203},"\u002Fshockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap)","shockwave-curriculum\u002Flessons\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":205,"title":206,"stem":207},"\u002Fshockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics","shockwave-curriculum\u002Flessons\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":209,"title":210,"stem":211},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":213,"title":214,"stem":215},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":217,"title":218,"stem":219},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":221,"title":222,"stem":223},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":225,"title":226,"stem":227},"\u002Fshockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods","shockwave-curriculum\u002Flessons\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":229,"title":230,"stem":231},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":233,"title":234,"stem":235},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":237,"title":238,"stem":239},"\u002Fshockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism","shockwave-curriculum\u002Flessons\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":241,"title":242,"stem":243},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":245,"title":246,"stem":247},"\u002Fshockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References","shockwave-curriculum\u002Flessons\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":249,"title":250,"stem":251},"\u002Fshockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern","shockwave-curriculum\u002Flessons\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":253,"title":254,"stem":255},"\u002Fshockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories","Static Factories","shockwave-curriculum\u002Flessons\u002Fch21-static-factories\u002F21-static-factories",{"path":257,"title":258,"stem":259},"\u002Fshockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern","shockwave-curriculum\u002Flessons\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":261,"title":262,"stem":263},"\u002Fshockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability","shockwave-curriculum\u002Flessons\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":265,"title":266,"stem":267},"\u002Fshockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions","shockwave-curriculum\u002Flessons\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":269,"title":270,"stem":271},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming?","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":273,"title":274,"stem":275},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":277,"title":278,"stem":279},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":281,"title":282,"stem":283},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":285,"title":286,"stem":287},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":289,"title":290,"stem":291},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":293,"title":294,"stem":295},"\u002Fshockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project","shockwave-curriculum\u002Flessons\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":297,"title":298,"stem":299},"\u002Fshockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways","shockwave-curriculum\u002Flessons\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":301,"title":302,"stem":303},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":305,"title":306,"stem":307},"\u002Fshockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design","shockwave-curriculum\u002Flessons\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":309,"title":310,"stem":311},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":313,"title":314,"stem":315},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":317,"title":318,"stem":319},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":321,"title":322,"stem":323},"\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting","shockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"path":325,"title":326,"stem":327},"\u002Fshockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F1-coming-soon","Git & GitHub Basics — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch29-git-and-github-basics\u002F29.1-coming-soon",{"path":329,"title":330,"stem":331},"\u002Fshockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F1-coming-soon","Git — History & Merging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch30-git-history-and-merging\u002F30.1-coming-soon",{"path":333,"title":334,"stem":335},"\u002Fshockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F1-coming-soon","Dev Environment & Tooling — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch31-dev-environment-and-tooling\u002F31.1-coming-soon",{"path":337,"title":338,"stem":339},"\u002Fshockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F1-coming-soon","Unit Testing — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch32-unit-testing\u002F32.1-coming-soon",{"path":341,"title":342,"stem":343},"\u002Fshockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F1-coming-soon","AdvantageKit — AutoLogging — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch33-advantagekit-autologging\u002F33.1-coming-soon",{"path":345,"title":346,"stem":347},"\u002Fshockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F1-coming-soon","Log Replay — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch34-log-replay\u002F34.1-coming-soon",{"path":349,"title":350,"stem":351},"\u002Fshockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F1-coming-soon","AdvantageScope I: Visualization — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch35-advantagescope-i-visualization\u002F35.1-coming-soon",{"path":353,"title":354,"stem":355},"\u002Fshockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F1-coming-soon","AdvantageScope II: Custom 3D Assets — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch36-advantagescope-ii-custom-3d-assets\u002F36.1-coming-soon",{"path":357,"title":358,"stem":359},"\u002Fshockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F1-coming-soon","Autonomous I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch37-autonomous-i\u002F37.1-coming-soon",{"path":361,"title":362,"stem":363},"\u002Fshockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F1-coming-soon","Autonomous II: PathPlanner & Trajectories — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch38-autonomous-ii-pathplanner-and-trajectories\u002F38.1-coming-soon",{"path":365,"title":366,"stem":367},"\u002Fshockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F1-coming-soon","Control Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch39-control-fundamentals\u002F39.1-coming-soon",{"path":369,"title":370,"stem":371},"\u002Fshockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F1-coming-soon","Motion Profiles — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch40-motion-profiles\u002F40.1-coming-soon",{"path":373,"title":374,"stem":375},"\u002Fshockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F1-coming-soon","Hardware Fundamentals — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch41-hardware-fundamentals\u002F41.1-coming-soon",{"path":377,"title":378,"stem":379},"\u002Fshockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F1-coming-soon","PhotonVision — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch42-photonvision\u002F42.1-coming-soon",{"path":381,"title":382,"stem":383},"\u002Fshockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F1-coming-soon","AprilTags & Pose — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch43-apriltags-and-pose\u002F43.1-coming-soon",{"path":385,"title":386,"stem":387},"\u002Fshockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F1-coming-soon","Subsystems I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch44-subsystems-i\u002F44.1-coming-soon",{"path":389,"title":390,"stem":391},"\u002Fshockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F1-coming-soon","Subsystems II — Advanced — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch45-subsystems-ii-advanced\u002F45.1-coming-soon",{"path":393,"title":394,"stem":395},"\u002Fshockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F1-coming-soon","Team Utilities I — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch46-team-utilities-i\u002F46.1-coming-soon",{"path":397,"title":398,"stem":399},"\u002Fshockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F1-coming-soon","Field Constants — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch47-field-constants\u002F47.1-coming-soon",{"path":401,"title":402,"stem":403},"\u002Fshockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F1-coming-soon","Troubleshooting I — Runtime Debug — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch48-troubleshooting-i-runtime-debug\u002F48.1-coming-soon",{"path":405,"title":406,"stem":407},"\u002Fshockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F1-coming-soon","Troubleshooting II: CAN & Sim — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch49-troubleshooting-ii-can-and-sim\u002F49.1-coming-soon",{"path":409,"title":410,"stem":411},"\u002Fshockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F1-coming-soon","Vendor Libraries: TalonFX — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch50-vendor-libraries-talonfx\u002F50.1-coming-soon",{"path":413,"title":414,"stem":415},"\u002Fshockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F1-coming-soon","Robot Alerts — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch51-robot-alerts\u002F51.1-coming-soon",{"path":417,"title":418,"stem":419},"\u002Fshockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F1-coming-soon","WPILib Commands — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch52-wpilib-commands\u002F52.1-coming-soon",{"path":421,"title":422,"stem":423},"\u002Fshockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F1-coming-soon","WPILib Geometry — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch53-wpilib-geometry\u002F53.1-coming-soon",{"path":425,"title":426,"stem":427},"\u002Fshockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F1-coming-soon","NetworkTables — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch54-networktables\u002F54.1-coming-soon",{"path":429,"title":430,"stem":431},"\u002Fshockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F1-coming-soon","Command Scheduler — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch55-command-scheduler\u002F55.1-coming-soon",{"path":433,"title":434,"stem":435},"\u002Fshockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F1-coming-soon","WPILib Timers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch56-wpilib-timers\u002F56.1-coming-soon",{"path":437,"title":438,"stem":439},"\u002Fshockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F1-coming-soon","WPILib Triggers — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch57-wpilib-triggers\u002F57.1-coming-soon",{"path":441,"title":442,"stem":443},"\u002Fshockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F1-coming-soon","Vendor Units & Conversions — Coming Soon","shockwave-curriculum\u002Flessons\u002Fch58-vendor-units-and-conversions\u002F58.1-coming-soon",[445,449,453,457,461,465,469,473,477,481,485,489,493,497,501,505,509,513,517,521,525,529,533,537,541,545,549,553,557,561,565,569,573,577,581,585,589,593,597,601,605,609,613,617,621,625,629,633,637,641,645,649,653,657,661,665,669,673,677,681,685,689,693,697,701,705,709,713,717,721,725,729,733,737,741,745,749],{"path":446,"title":447,"stem":448},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":450,"title":451,"stem":452},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":454,"title":455,"stem":456},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":458,"title":459,"stem":460},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":462,"title":463,"stem":464},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":466,"title":467,"stem":468},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":470,"title":471,"stem":472},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":474,"title":475,"stem":476},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":478,"title":479,"stem":480},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":482,"title":483,"stem":484},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":486,"title":487,"stem":488},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":490,"title":491,"stem":492},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":494,"title":495,"stem":496},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":498,"title":499,"stem":500},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":502,"title":503,"stem":504},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":506,"title":507,"stem":508},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":510,"title":511,"stem":512},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":514,"title":515,"stem":516},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":518,"title":519,"stem":520},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":522,"title":523,"stem":524},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":526,"title":527,"stem":528},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":530,"title":531,"stem":532},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":534,"title":535,"stem":536},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":538,"title":539,"stem":540},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":542,"title":543,"stem":544},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F8-while-loops","While Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.8-while-loops",{"path":546,"title":547,"stem":548},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":550,"title":551,"stem":552},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F1-strings","Strings — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.1-strings",{"path":554,"title":555,"stem":556},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch06-strings\u002F6.2-string-algorithms",{"path":558,"title":559,"stem":560},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":562,"title":563,"stem":564},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":566,"title":567,"stem":568},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":570,"title":571,"stem":572},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":574,"title":575,"stem":576},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":578,"title":579,"stem":580},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":582,"title":583,"stem":584},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":586,"title":587,"stem":588},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":590,"title":591,"stem":592},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":594,"title":595,"stem":596},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":598,"title":599,"stem":600},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":602,"title":603,"stem":604},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":606,"title":607,"stem":608},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":610,"title":611,"stem":612},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":614,"title":615,"stem":616},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":618,"title":619,"stem":620},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":622,"title":623,"stem":624},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":626,"title":627,"stem":628},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":630,"title":631,"stem":632},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":634,"title":635,"stem":636},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":638,"title":639,"stem":640},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":642,"title":643,"stem":644},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":646,"title":647,"stem":648},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":650,"title":651,"stem":652},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":654,"title":655,"stem":656},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":658,"title":659,"stem":660},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":662,"title":663,"stem":664},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":666,"title":667,"stem":668},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":670,"title":671,"stem":672},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":674,"title":675,"stem":676},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":678,"title":679,"stem":680},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":682,"title":683,"stem":684},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":686,"title":687,"stem":688},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch21-static-factories\u002F21-static-factories",{"path":690,"title":691,"stem":692},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":694,"title":695,"stem":696},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":698,"title":699,"stem":700},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":702,"title":703,"stem":704},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":706,"title":707,"stem":708},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":710,"title":711,"stem":712},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":714,"title":715,"stem":716},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":718,"title":719,"stem":720},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":722,"title":723,"stem":724},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":726,"title":727,"stem":728},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":730,"title":731,"stem":732},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":734,"title":735,"stem":736},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":738,"title":739,"stem":740},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":742,"title":743,"stem":744},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":746,"title":747,"stem":748},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":750,"title":751,"stem":752},"\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Worked Example","shockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",[754,758,762,766,770,774,778,782,786,790,794,798,802,806,810,814,818,822,826,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,890,894,898,902,906,910,914,918,922,926,930,934,938,942,946,950,954,958,962,966,970,974,978,982,986,990,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046,1050,1054,1058,1062,1066],{"path":755,"title":756,"stem":757},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F2-intro-to-algorithms-programming-and-compilers","Intro to Algorithms, Programming and Compilers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch01-why-java-for-frc\u002F1.2-intro-to-algorithms-programming-and-compilers",{"path":759,"title":760,"stem":761},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F1-variables-and-data-types","Variables & Data Types — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.1-variables-and-data-types",{"path":763,"title":764,"stem":765},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2-expressions-and-output","Expressions & Output — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.2-expressions-and-output",{"path":767,"title":768,"stem":769},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F3-assignment-and-input","Assignment & Input — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.3-assignment-and-input",{"path":771,"title":772,"stem":773},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F4-casting-and-ranges-of-values","Casting & Ranges of Values — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.4-casting-and-ranges-of-values",{"path":775,"title":776,"stem":777},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F5-compound-assignment-operators","Compound Assignment Operators — Exercises","shockwave-curriculum\u002Fexercises\u002Fch02-variables-and-types\u002F2.5-compound-assignment-operators",{"path":779,"title":780,"stem":781},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F1-apis-and-libraries","APIs and Libraries — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.1-apis-and-libraries",{"path":783,"title":784,"stem":785},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F2-documentation-with-comments-and-preconditions","Documentation with Comments and Preconditions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.2-documentation-with-comments-and-preconditions",{"path":787,"title":788,"stem":789},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3-packages-and-imports","Packages & Imports — Exercises","shockwave-curriculum\u002Fexercises\u002Fch03-apis-libraries-and-documentation\u002F3.3-packages-and-imports",{"path":791,"title":792,"stem":793},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F1-methods-signatures-and-parameters","Methods, Signatures & Parameters — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.1-methods-signatures-and-parameters",{"path":795,"title":796,"stem":797},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F2-calling-class-methods","Calling Class Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.2-calling-class-methods",{"path":799,"title":800,"stem":801},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F3-using-the-math-class","Using the Math Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.3-using-the-math-class",{"path":803,"title":804,"stem":805},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4-objects-instances-of-classes","Objects — Instances of Classes — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.4-objects-instances-of-classes",{"path":807,"title":808,"stem":809},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F5-creating-and-initializing-objects-constructors","Creating & Initializing Objects: Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.5-creating-and-initializing-objects-constructors",{"path":811,"title":812,"stem":813},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F6-calling-instance-methods","Calling Instance Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch04-using-objects-and-calling-methods\u002F4.6-calling-instance-methods",{"path":815,"title":816,"stem":817},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F1-5.2-if-statements-and-for-loops","if Statements & For Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.1-5.2-if-statements-and-for-loops",{"path":819,"title":820,"stem":821},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F10-nested-iteration","Nested Iteration — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.10-nested-iteration",{"path":823,"title":824,"stem":825},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F11-informal-runtime-analysis-of-loops","Informal Runtime Analysis of Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.11-informal-runtime-analysis-of-loops",{"path":827,"title":828,"stem":829},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F12-switch-statements-and-expressions","switch Statements and Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.12-switch-statements-and-expressions",{"path":831,"title":832,"stem":833},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F3-algorithms-with-selection-and-repetition","Algorithms with Selection and Repetition — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.3-algorithms-with-selection-and-repetition",{"path":835,"title":836,"stem":837},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F4-boolean-expressions","Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.4-boolean-expressions",{"path":839,"title":840,"stem":841},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5-nested-if-statements","Nested if Statements — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.5-nested-if-statements",{"path":843,"title":844,"stem":845},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F6-compound-boolean-expressions","Compound Boolean Expressions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.6-compound-boolean-expressions",{"path":847,"title":848,"stem":849},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F7-comparing-boolean-expressions-de-morgans-laws","Comparing Boolean Expressions (De Morgan's Laws) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.7-comparing-boolean-expressions-de-morgans-laws",{"path":851,"title":852,"stem":853},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F8-while-loops","While Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.8-while-loops",{"path":855,"title":856,"stem":857},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F9-implementing-selection-and-iteration-algorithms","Implementing Selection and Iteration Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch05-control-structures\u002F5.9-implementing-selection-and-iteration-algorithms",{"path":859,"title":860,"stem":861},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F1-strings","Strings — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.1-strings",{"path":863,"title":864,"stem":865},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F2-string-algorithms","String Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch06-strings\u002F6.2-string-algorithms",{"path":867,"title":868,"stem":869},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F1-anatomy-of-a-java-class","Anatomy of a Java Class — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.1-anatomy-of-a-java-class",{"path":871,"title":872,"stem":873},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F2-methods-how-to-write-them","Methods: How to Write Them — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.2-methods-how-to-write-them",{"path":875,"title":876,"stem":877},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F3-methods-passing-and-returning-references-of-an-object","Methods: Passing & Returning References of an Object — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.3-methods-passing-and-returning-references-of-an-object",{"path":879,"title":880,"stem":881},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F4-class-static-variables-and-methods","Class (static) Variables & Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch07-the-class-blueprint\u002F7.4-class-static-variables-and-methods",{"path":883,"title":884,"stem":885},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F1-8.2-constructors-and-this","Constructors & \"this\" — Exercises","shockwave-curriculum\u002Fexercises\u002Fch08-constructors-and-this\u002F8.1-8.2-constructors-and-this",{"path":887,"title":888,"stem":889},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F1-array-creation-and-access","Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.1-array-creation-and-access",{"path":891,"title":892,"stem":893},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F2-arraylist-and-its-methods","ArrayList and its Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.2-arraylist-and-its-methods",{"path":895,"title":896,"stem":897},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F3-optional-hashmap-dictionary-data-structure","HashMap (Dictionary) Data Structure — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.3-optional-hashmap-dictionary-data-structure",{"path":899,"title":900,"stem":901},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F4-array-traversals","Array Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.4-array-traversals",{"path":903,"title":904,"stem":905},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F5-implementing-array-algorithms","Implementing Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.5-implementing-array-algorithms",{"path":907,"title":908,"stem":909},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F6-arraylist-traversals","ArrayList Traversals — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.6-arraylist-traversals",{"path":911,"title":912,"stem":913},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F7-implementing-arraylist-algorithms","Implementing ArrayList Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.7-implementing-arraylist-algorithms",{"path":915,"title":916,"stem":917},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F8-using-text-files","Using Text Files — Exercises","shockwave-curriculum\u002Fexercises\u002Fch09-storing-data\u002F9.8-using-text-files",{"path":919,"title":920,"stem":921},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F1-2d-array-creation-and-access","2D Array Creation and Access — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.1-2d-array-creation-and-access",{"path":923,"title":924,"stem":925},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F2-2d-array-traversals-nested-loops","2D Array Traversals: Nested Loops — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.2-2d-array-traversals-nested-loops",{"path":927,"title":928,"stem":929},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F3-implementing-2d-array-algorithms","Implementing 2D Array Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch10-2d-arrays\u002F10.3-implementing-2d-array-algorithms",{"path":931,"title":932,"stem":933},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices","Enums: Named Choices — Exercises","shockwave-curriculum\u002Fexercises\u002Fch11-enums-named-choices\u002F11-enums-named-choices",{"path":935,"title":936,"stem":937},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch","Exceptions & try\u002Fcatch — Exercises","shockwave-curriculum\u002Fexercises\u002Fch12-exceptions-and-try-catch\u002F12-exceptions-and-try-catch",{"path":939,"title":940,"stem":941},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas","Common Gotchas — Exercises","shockwave-curriculum\u002Fexercises\u002Fch13-common-gotchas\u002F13-common-gotchas",{"path":943,"title":944,"stem":945},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns","Why Design Patterns? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch14-why-design-patterns\u002F14-why-design-patterns",{"path":947,"title":948,"stem":949},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections","Advanced Collections (Set\u002FQueue\u002FMap) — Exercises","shockwave-curriculum\u002Fexercises\u002Fch15-advanced-collections\u002F15-advanced-collections",{"path":951,"title":952,"stem":953},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics","Writing Your Own Generics — Exercises","shockwave-curriculum\u002Fexercises\u002Fch16-writing-your-own-generics\u002F16-writing-your-own-generics",{"path":955,"title":956,"stem":957},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F1-inheritance-superclass-subclass","Inheritance, Superclass, Subclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.1-inheritance-superclass-subclass",{"path":959,"title":960,"stem":961},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F2-inheritance-and-constructors","Inheritance and Constructors — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.2-inheritance-and-constructors",{"path":963,"title":964,"stem":965},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F3-inheritance-hierarchies","Inheritance Hierarchies — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.3-inheritance-hierarchies",{"path":967,"title":968,"stem":969},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F4-object-superclass","Object Superclass — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.4-object-superclass",{"path":971,"title":972,"stem":973},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F5-abstract-classes-and-methods","Abstract Classes and Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch17-inheritance-and-abstractions\u002F17.5-abstract-classes-and-methods",{"path":975,"title":976,"stem":977},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F1-overriding-methods","Overriding Methods — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.1-overriding-methods",{"path":979,"title":980,"stem":981},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F2-super-keyword","super Keyword — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.2-super-keyword",{"path":983,"title":984,"stem":985},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F3-polymorphism","Polymorphism — Exercises","shockwave-curriculum\u002Fexercises\u002Fch18-polymorphism-many-forms\u002F18.3-polymorphism",{"path":987,"title":988,"stem":989},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts","Interfaces as Contracts — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19-interfaces-as-contracts",{"path":991,"title":992,"stem":993},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F1-lambdas-and-method-references","Lambdas & Method References — Exercises","shockwave-curriculum\u002Fexercises\u002Fch19-interfaces-as-contracts\u002F19.1-lambdas-and-method-references",{"path":995,"title":996,"stem":997},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern","The IO-Layer Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch20-the-io-layer-pattern\u002F20-the-io-layer-pattern",{"path":999,"title":1000,"stem":1001},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories","Static Factories — Exercises","shockwave-curriculum\u002Fexercises\u002Fch21-static-factories\u002F21-static-factories",{"path":1003,"title":1004,"stem":1005},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern","The Builder Pattern — Exercises","shockwave-curriculum\u002Fexercises\u002Fch22-the-builder-pattern\u002F22-the-builder-pattern",{"path":1007,"title":1008,"stem":1009},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F1-scope-and-access","Access, final, and Immutability — Exercises","shockwave-curriculum\u002Fexercises\u002Fch23-encapsulation-and-final\u002F23.1-scope-and-access",{"path":1011,"title":1012,"stem":1013},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions","Optional: Avoiding Null Pointer Exceptions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch24-optional-avoiding-null-pointer-exceptions\u002F24-optional-avoiding-null-pointer-exceptions",{"path":1015,"title":1016,"stem":1017},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F1-what-is-command-based-programming","What Is Command-Based Programming? — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.1-what-is-command-based-programming",{"path":1019,"title":1020,"stem":1021},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F2-commands-and-command-compositions","Commands & Command Compositions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.2-commands-and-command-compositions",{"path":1023,"title":1024,"stem":1025},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F3-the-command-scheduler","The Command Scheduler — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.3-the-command-scheduler",{"path":1027,"title":1028,"stem":1029},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F4-state-machines-logic","State Machines: Logic — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.4-state-machines-logic",{"path":1031,"title":1032,"stem":1033},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F5-managing-transitions","Managing Transitions — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.5-managing-transitions",{"path":1035,"title":1036,"stem":1037},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F6-binding-commands-to-triggers","Binding Commands to Triggers — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.6-binding-commands-to-triggers",{"path":1039,"title":1040,"stem":1041},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F7-structuring-a-command-based-robot-project","Structuring a Command-Based Robot Project — Exercises","shockwave-curriculum\u002Fexercises\u002Fch25-command-based-programming\u002F25.7-structuring-a-command-based-robot-project",{"path":1043,"title":1044,"stem":1045},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways","Architecture Takeaways — Exercises","shockwave-curriculum\u002Fexercises\u002Fch26-architecture-takeaways\u002F26-architecture-takeaways",{"path":1047,"title":1048,"stem":1049},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F1-abstraction-and-program-design","Abstraction and Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.1-abstraction-and-program-design",{"path":1051,"title":1052,"stem":1053},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F2-impact-of-program-design","Impact of Program Design — Exercises","shockwave-curriculum\u002Fexercises\u002Fch27-program-design-and-abstraction\u002F27.2-impact-of-program-design",{"path":1055,"title":1056,"stem":1057},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F1-searching-algorithms","Searching Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.1-searching-algorithms",{"path":1059,"title":1060,"stem":1061},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F2-sorting-algorithms","Sorting Algorithms — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms",{"path":1063,"title":1064,"stem":1065},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F3-recursion","Recursion — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.3-recursion",{"path":1067,"title":1068,"stem":1069},"\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F4-recursive-searching-and-sorting","Recursive Searching and Sorting — Exercises","shockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.4-recursive-searching-and-sorting",{"id":1071,"title":314,"body":1072,"description":1085,"extension":1584,"meta":1585,"navigation":1430,"path":313,"seo":1588,"stem":315,"__hash__":1589},"lessons\u002Fshockwave-curriculum\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms.md",{"type":1073,"value":1074,"toc":1575},"minimark",[1075,1079,1086,1091,1094,1098,1104,1224,1235,1238,1242,1248,1326,1337,1341,1352,1404,1408,1411,1461,1502,1506,1539,1543,1560,1571],[1076,1077,314],"h1",{"id":1078},"sorting-algorithms",[1080,1081,1082],"p",{},[1083,1084,1085],"strong",{},"⚠ Optional chapter.",[1087,1088,1090],"h2",{"id":1089},"why-sort-at-all","Why Sort at All",[1080,1092,1093],{},"Binary search (Lesson 28.1) needs sorted data to work, and sorted match-scouting data, sensor logs, or leaderboard scores are simply easier for a human to read. Two straightforward sorting algorithms cover the core idea; a third, more efficient one (merge sort) is covered in Lesson 28.4.",[1087,1095,1097],{"id":1096},"selection-sort","Selection Sort",[1080,1099,1100,1103],{},[1083,1101,1102],{},"Selection sort"," repeatedly finds the smallest remaining value and swaps it into its correct, final position — first position 0, then position 1, and so on:",[1105,1106,1111],"pre",{"className":1107,"code":1108,"language":1109,"meta":1110,"style":1110},"language-java shiki shiki-themes github-light github-dark","public static void selectionSort(double[] sensorReadings)\n{\n    for (int j = 0; j \u003C sensorReadings.length - 1; j++)\n    {\n        \u002F\u002F assume the current position holds the smallest remaining value\n        int minIndex = j;\n        for (int k = j + 1; k \u003C sensorReadings.length; k++)\n        {\n            if (sensorReadings[k] \u003C sensorReadings[minIndex])\n            {\n                minIndex = k; \u002F\u002F found something smaller — remember its index\n            }\n        }\n        double temp = sensorReadings[j];\n        sensorReadings[j] = sensorReadings[minIndex];\n        sensorReadings[minIndex] = temp;\n    }\n}\n","java","",[1112,1113,1114,1122,1128,1134,1140,1146,1152,1158,1164,1170,1176,1182,1188,1194,1200,1206,1212,1218],"code",{"__ignoreMap":1110},[1115,1116,1119],"span",{"class":1117,"line":1118},"line",1,[1115,1120,1121],{},"public static void selectionSort(double[] sensorReadings)\n",[1115,1123,1125],{"class":1117,"line":1124},2,[1115,1126,1127],{},"{\n",[1115,1129,1131],{"class":1117,"line":1130},3,[1115,1132,1133],{},"    for (int j = 0; j \u003C sensorReadings.length - 1; j++)\n",[1115,1135,1137],{"class":1117,"line":1136},4,[1115,1138,1139],{},"    {\n",[1115,1141,1143],{"class":1117,"line":1142},5,[1115,1144,1145],{},"        \u002F\u002F assume the current position holds the smallest remaining value\n",[1115,1147,1149],{"class":1117,"line":1148},6,[1115,1150,1151],{},"        int minIndex = j;\n",[1115,1153,1155],{"class":1117,"line":1154},7,[1115,1156,1157],{},"        for (int k = j + 1; k \u003C sensorReadings.length; k++)\n",[1115,1159,1161],{"class":1117,"line":1160},8,[1115,1162,1163],{},"        {\n",[1115,1165,1167],{"class":1117,"line":1166},9,[1115,1168,1169],{},"            if (sensorReadings[k] \u003C sensorReadings[minIndex])\n",[1115,1171,1173],{"class":1117,"line":1172},10,[1115,1174,1175],{},"            {\n",[1115,1177,1179],{"class":1117,"line":1178},11,[1115,1180,1181],{},"                minIndex = k; \u002F\u002F found something smaller — remember its index\n",[1115,1183,1185],{"class":1117,"line":1184},12,[1115,1186,1187],{},"            }\n",[1115,1189,1191],{"class":1117,"line":1190},13,[1115,1192,1193],{},"        }\n",[1115,1195,1197],{"class":1117,"line":1196},14,[1115,1198,1199],{},"        double temp = sensorReadings[j];\n",[1115,1201,1203],{"class":1117,"line":1202},15,[1115,1204,1205],{},"        sensorReadings[j] = sensorReadings[minIndex];\n",[1115,1207,1209],{"class":1117,"line":1208},16,[1115,1210,1211],{},"        sensorReadings[minIndex] = temp;\n",[1115,1213,1215],{"class":1117,"line":1214},17,[1115,1216,1217],{},"    }\n",[1115,1219,1221],{"class":1117,"line":1220},18,[1115,1222,1223],{},"}\n",[1080,1225,1226,1227,1230,1231,1234],{},"This is Ch.9.5's running min\u002Fmax pattern, tracking the index of the best value seen so far instead of the value itself, done once per position: the outer loop tracks which position is being filled next; the inner loop always starts at ",[1112,1228,1229],{},"j + 1",", since everything before ",[1112,1232,1233],{},"j"," is already sorted and shouldn't be re-scanned.",[1080,1236,1237],{},"Selection sort takes the same amount of work regardless of the data's initial order — it always scans the entire unsorted remainder to find the minimum, every single pass.",[1087,1239,1241],{"id":1240},"insertion-sort","Insertion Sort",[1080,1243,1244,1247],{},[1083,1245,1246],{},"Insertion sort"," instead takes each element and inserts it into its correct position among the already-sorted elements to its left, shifting larger values right to make room:",[1105,1249,1251],{"className":1107,"code":1250,"language":1109,"meta":1110,"style":1110},"public static void insertionSort(double[] sensorReadings)\n{\n    for (int j = 1; j \u003C sensorReadings.length; j++)\n    {\n        double temp = sensorReadings[j];\n        int possibleIndex = j;\n        while (possibleIndex > 0 && temp \u003C sensorReadings[possibleIndex - 1])\n        {\n            \u002F\u002F shift right\n            sensorReadings[possibleIndex] = sensorReadings[possibleIndex - 1];\n            possibleIndex--;\n        }\n        \u002F\u002F place temp in its final spot for this pass\n        sensorReadings[possibleIndex] = temp;\n    }\n}\n",[1112,1252,1253,1258,1262,1267,1271,1275,1280,1285,1289,1294,1299,1304,1308,1313,1318,1322],{"__ignoreMap":1110},[1115,1254,1255],{"class":1117,"line":1118},[1115,1256,1257],{},"public static void insertionSort(double[] sensorReadings)\n",[1115,1259,1260],{"class":1117,"line":1124},[1115,1261,1127],{},[1115,1263,1264],{"class":1117,"line":1130},[1115,1265,1266],{},"    for (int j = 1; j \u003C sensorReadings.length; j++)\n",[1115,1268,1269],{"class":1117,"line":1136},[1115,1270,1139],{},[1115,1272,1273],{"class":1117,"line":1142},[1115,1274,1199],{},[1115,1276,1277],{"class":1117,"line":1148},[1115,1278,1279],{},"        int possibleIndex = j;\n",[1115,1281,1282],{"class":1117,"line":1154},[1115,1283,1284],{},"        while (possibleIndex > 0 && temp \u003C sensorReadings[possibleIndex - 1])\n",[1115,1286,1287],{"class":1117,"line":1160},[1115,1288,1163],{},[1115,1290,1291],{"class":1117,"line":1166},[1115,1292,1293],{},"            \u002F\u002F shift right\n",[1115,1295,1296],{"class":1117,"line":1172},[1115,1297,1298],{},"            sensorReadings[possibleIndex] = sensorReadings[possibleIndex - 1];\n",[1115,1300,1301],{"class":1117,"line":1178},[1115,1302,1303],{},"            possibleIndex--;\n",[1115,1305,1306],{"class":1117,"line":1184},[1115,1307,1193],{},[1115,1309,1310],{"class":1117,"line":1190},[1115,1311,1312],{},"        \u002F\u002F place temp in its final spot for this pass\n",[1115,1314,1315],{"class":1117,"line":1196},[1115,1316,1317],{},"        sensorReadings[possibleIndex] = temp;\n",[1115,1319,1320],{"class":1117,"line":1202},[1115,1321,1217],{},[1115,1323,1324],{"class":1117,"line":1208},[1115,1325,1223],{},[1080,1327,1328,1329,1332,1333,1336],{},"Unlike selection sort, insertion sort is ",[1083,1330,1331],{},"adaptive"," — if the data is already (or nearly) sorted, the ",[1112,1334,1335],{},"while"," loop's condition fails almost immediately for most elements, doing very little actual shifting. Data that's already sorted descending is insertion sort's worst case, since every element has to shift all the way to the front.",[1087,1338,1340],{"id":1339},"comparing-the-two","Comparing the Two",[1080,1342,1343,1344,1347,1348,1351],{},"Both algorithms have similar overall growth (roughly ",[1112,1345,1346],{},"n²"," comparisons for ",[1112,1349,1350],{},"n"," elements, in the worst case) — but they behave differently depending on the input:",[1353,1354,1355,1368],"table",{},[1356,1357,1358],"thead",{},[1359,1360,1361,1364,1366],"tr",{},[1362,1363],"th",{},[1362,1365,1097],{},[1362,1367,1241],{},[1369,1370,1371,1383,1393],"tbody",{},[1359,1372,1373,1377,1380],{},[1374,1375,1376],"td",{},"Already sorted ascending",[1374,1378,1379],{},"No speedup — same work every time",[1374,1381,1382],{},"Much faster — adaptive",[1359,1384,1385,1388,1390],{},[1374,1386,1387],{},"Already sorted descending",[1374,1389,1379],{},[1374,1391,1392],{},"Worst case — maximum shifting",[1359,1394,1395,1398,1401],{},[1374,1396,1397],{},"Typical use",[1374,1399,1400],{},"Simple, predictable cost",[1374,1402,1403],{},"Good when data is already mostly sorted",[1087,1405,1407],{"id":1406},"in-real-code","In Real Code",[1080,1409,1410],{},"Real Java code almost never hand-writes selection or insertion sort — they're taught here to build the underlying intuition, not because production code should use them. The standard library already provides a sort, and it's both correct and far more heavily optimized than a hand-rolled version:",[1105,1412,1414],{"className":1107,"code":1413,"language":1109,"meta":1110,"style":1110},"int[] readings = {31, 19, 42, 8, 3};\nArrays.sort(readings); \u002F\u002F sorts the array in place, ascending\n\nList\u003CString> names = new ArrayList\u003C>(List.of(\"Shooter\", \"Intake\", \"Climber\"));\nCollections.sort(names);   \u002F\u002F sorts a List in place\nnames.sort(null);          \u002F\u002F list.sort(...) does the same thing\n\n\u002F\u002F sort by a derived value instead of natural order\nnames.sort(Comparator.comparing(String::length));\n",[1112,1415,1416,1421,1426,1432,1437,1442,1447,1451,1456],{"__ignoreMap":1110},[1115,1417,1418],{"class":1117,"line":1118},[1115,1419,1420],{},"int[] readings = {31, 19, 42, 8, 3};\n",[1115,1422,1423],{"class":1117,"line":1124},[1115,1424,1425],{},"Arrays.sort(readings); \u002F\u002F sorts the array in place, ascending\n",[1115,1427,1428],{"class":1117,"line":1130},[1115,1429,1431],{"emptyLinePlaceholder":1430},true,"\n",[1115,1433,1434],{"class":1117,"line":1136},[1115,1435,1436],{},"List\u003CString> names = new ArrayList\u003C>(List.of(\"Shooter\", \"Intake\", \"Climber\"));\n",[1115,1438,1439],{"class":1117,"line":1142},[1115,1440,1441],{},"Collections.sort(names);   \u002F\u002F sorts a List in place\n",[1115,1443,1444],{"class":1117,"line":1148},[1115,1445,1446],{},"names.sort(null);          \u002F\u002F list.sort(...) does the same thing\n",[1115,1448,1449],{"class":1117,"line":1154},[1115,1450,1431],{"emptyLinePlaceholder":1430},[1115,1452,1453],{"class":1117,"line":1160},[1115,1454,1455],{},"\u002F\u002F sort by a derived value instead of natural order\n",[1115,1457,1458],{"class":1117,"line":1166},[1115,1459,1460],{},"names.sort(Comparator.comparing(String::length));\n",[1080,1462,1463,1466,1467,1466,1470,1473,1474,1477,1478,1481,1482,1485,1486,1489,1490,1493,1494,1497,1498,1501],{},[1112,1464,1465],{},"Arrays.sort","\u002F",[1112,1468,1469],{},"Collections.sort",[1112,1471,1472],{},"list.sort"," with no extra argument rely on the elements' ",[1083,1475,1476],{},"natural ordering"," — for that to work, the element type must implement ",[1112,1479,1480],{},"Comparable"," (",[1112,1483,1484],{},"String"," and the wrapper classes already do; ",[1112,1487,1488],{},"compareTo",", Ch.6.1, is exactly what they compare with). ",[1112,1491,1492],{},"Comparator.comparing(...)"," builds a custom ordering on the fly, for cases where natural ordering isn't what's wanted (like sorting by length instead of alphabetically). And printing an array directly (",[1112,1495,1496],{},"System.out.println(readings)",") never shows its contents usefully — ",[1112,1499,1500],{},"Arrays.toString(readings)"," is the everyday way to see what's actually inside one.",[1087,1503,1505],{"id":1504},"common-pitfalls","Common Pitfalls",[1507,1508,1509,1519,1533],"ul",{},[1510,1511,1512,1518],"li",{},[1083,1513,1514,1515,1517],{},"Starting selection sort's inner loop at index 0 instead of ",[1112,1516,1229],{},"."," That re-scans (and can undo) already-correctly-placed elements from earlier passes.",[1510,1520,1521,1524,1525,1528,1529,1532],{},[1083,1522,1523],{},"Stopping insertion sort's outer loop one element too early."," The loop must run through the entire array (",[1112,1526,1527],{},"j \u003C length","), not ",[1112,1530,1531],{},"length - 1",", or the very last element never gets inserted into its sorted position.",[1510,1534,1535,1538],{},[1083,1536,1537],{},"Assuming either algorithm's runtime depends on input order the same way."," Selection sort's cost is fixed regardless of order; insertion sort's genuinely isn't — that's the entire point of calling it adaptive.",[1087,1540,1542],{"id":1541},"key-takeaways","Key Takeaways",[1507,1544,1545,1548,1551,1557],{},[1510,1546,1547],{},"Selection sort repeatedly finds the minimum of the remaining unsorted portion and swaps it into place — same cost regardless of initial order.",[1510,1549,1550],{},"Insertion sort inserts each element into its correct position among already-sorted elements to its left, shifting as needed — adaptive, much faster on nearly-sorted data.",[1510,1552,1553,1554,1556],{},"Both run roughly ",[1112,1555,1346],{}," in the worst case, but real-world performance can differ significantly depending on how sorted the input already is.",[1510,1558,1559],{},"Sorted data unlocks binary search (Lesson 28.1) — one reason sorting matters beyond just readability.",[1080,1561,1562,1563,1566,1567,1570],{},"Derived from ",[1112,1564,1565],{},"csawesome-2026",": ",[1112,1568,1569],{},"unit-4-data-collections\u002F4.15-sorting-algorithms.md"," (CSA 4.15)",[1572,1573,1574],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1110,"searchDepth":1124,"depth":1124,"links":1576},[1577,1578,1579,1580,1581,1582,1583],{"id":1089,"depth":1124,"text":1090},{"id":1096,"depth":1124,"text":1097},{"id":1240,"depth":1124,"text":1241},{"id":1339,"depth":1124,"text":1340},{"id":1406,"depth":1124,"text":1407},{"id":1504,"depth":1124,"text":1505},{"id":1541,"depth":1124,"text":1542},"md",{"outlineRef":1586,"status":1587},"28.2 — Sorting Algorithms (CSA 4.15)","new — authored lesson",{"title":314,"description":1085},"qvhCLO_rp9aR0INms3BOdVVlDeDWiJ1yVgwqPzaipso",{"id":1591,"title":743,"body":1592,"description":1110,"extension":1584,"meta":2195,"navigation":1430,"path":742,"seo":2198,"stem":744,"__hash__":2199},"examples\u002Fshockwave-curriculum\u002Fexamples\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms.md",{"type":1073,"value":1593,"toc":2187},[1594,1597,1601,1604,1608,1623,1638,1642,1723,1726,1841,1850,1857,1861,1927,1934,2037,2065,2069,2128,2131,2148,2152,2185],[1076,1595,743],{"id":1596},"sorting-algorithms-worked-example",[1087,1598,1600],{"id":1599},"problem","Problem",[1080,1602,1603],{},"During drive practice, the team timed five scoring cycles (in seconds). Sort the times from fastest to slowest so the drive coach can see the best cycles first. Sort one copy with selection sort and another copy with insertion sort, and track what the array looks like after every pass of each.",[1087,1605,1607],{"id":1606},"step-1-plan-it-first","Step 1: Plan It First",[1609,1610,1611,1614,1617,1620],"ol",{},[1510,1612,1613],{},"Store the five cycle times, and make a second copy so each sort starts from the same unsorted data.",[1510,1615,1616],{},"Selection sort: on each pass, find the smallest remaining time and swap it into the next position.",[1510,1618,1619],{},"Insertion sort: on each pass, take the next time and shift it left into its spot among the already-sorted times.",[1510,1621,1622],{},"Compare the passes.",[1105,1624,1626],{"className":1107,"code":1625,"language":1109,"meta":1110,"style":1110},"int[] cycleTimes = {14, 9, 21, 6, 11};\nint[] cycleTimesCopy = {14, 9, 21, 6, 11};\n",[1112,1627,1628,1633],{"__ignoreMap":1110},[1115,1629,1630],{"class":1117,"line":1118},[1115,1631,1632],{},"int[] cycleTimes = {14, 9, 21, 6, 11};\n",[1115,1634,1635],{"class":1117,"line":1124},[1115,1636,1637],{},"int[] cycleTimesCopy = {14, 9, 21, 6, 11};\n",[1087,1639,1641],{"id":1640},"step-2-selection-sort","Step 2: Selection Sort",[1105,1643,1645],{"className":1107,"code":1644,"language":1109,"meta":1110,"style":1110},"public static void selectionSort(int[] times)\n{\n    for (int j = 0; j \u003C times.length - 1; j++)\n    {\n        int minIndex = j;\n        for (int k = j + 1; k \u003C times.length; k++)\n        {\n            if (times[k] \u003C times[minIndex])\n            {\n                minIndex = k;\n            }\n        }\n        int temp = times[j];\n        times[j] = times[minIndex];\n        times[minIndex] = temp;\n    }\n}\n",[1112,1646,1647,1652,1656,1661,1665,1669,1674,1678,1683,1687,1692,1696,1700,1705,1710,1715,1719],{"__ignoreMap":1110},[1115,1648,1649],{"class":1117,"line":1118},[1115,1650,1651],{},"public static void selectionSort(int[] times)\n",[1115,1653,1654],{"class":1117,"line":1124},[1115,1655,1127],{},[1115,1657,1658],{"class":1117,"line":1130},[1115,1659,1660],{},"    for (int j = 0; j \u003C times.length - 1; j++)\n",[1115,1662,1663],{"class":1117,"line":1136},[1115,1664,1139],{},[1115,1666,1667],{"class":1117,"line":1142},[1115,1668,1151],{},[1115,1670,1671],{"class":1117,"line":1148},[1115,1672,1673],{},"        for (int k = j + 1; k \u003C times.length; k++)\n",[1115,1675,1676],{"class":1117,"line":1154},[1115,1677,1163],{},[1115,1679,1680],{"class":1117,"line":1160},[1115,1681,1682],{},"            if (times[k] \u003C times[minIndex])\n",[1115,1684,1685],{"class":1117,"line":1166},[1115,1686,1175],{},[1115,1688,1689],{"class":1117,"line":1172},[1115,1690,1691],{},"                minIndex = k;\n",[1115,1693,1694],{"class":1117,"line":1178},[1115,1695,1187],{},[1115,1697,1698],{"class":1117,"line":1184},[1115,1699,1193],{},[1115,1701,1702],{"class":1117,"line":1190},[1115,1703,1704],{},"        int temp = times[j];\n",[1115,1706,1707],{"class":1117,"line":1196},[1115,1708,1709],{},"        times[j] = times[minIndex];\n",[1115,1711,1712],{"class":1117,"line":1202},[1115,1713,1714],{},"        times[minIndex] = temp;\n",[1115,1716,1717],{"class":1117,"line":1208},[1115,1718,1217],{},[1115,1720,1721],{"class":1117,"line":1214},[1115,1722,1223],{},[1080,1724,1725],{},"The array after each pass of the outer loop:",[1353,1727,1728,1752],{},[1356,1729,1730],{},[1359,1731,1732,1738,1741,1746,1749],{},[1362,1733,1734,1735,1737],{},"Pass (",[1112,1736,1233],{},")",[1362,1739,1740],{},"Smallest remaining",[1362,1742,1743],{},[1112,1744,1745],{},"minIndex",[1362,1747,1748],{},"Swap",[1362,1750,1751],{},"Array after the pass",[1369,1753,1754,1770,1789,1806,1825],{},[1359,1755,1756,1759,1761,1763,1765],{},[1374,1757,1758],{},"start",[1374,1760],{},[1374,1762],{},[1374,1764],{},[1374,1766,1767],{},[1112,1768,1769],{},"{14, 9, 21, 6, 11}",[1359,1771,1772,1775,1778,1781,1784],{},[1374,1773,1774],{},"0",[1374,1776,1777],{},"6",[1374,1779,1780],{},"3",[1374,1782,1783],{},"index 0 and index 3",[1374,1785,1786],{},[1112,1787,1788],{},"{6, 9, 21, 14, 11}",[1359,1790,1791,1794,1797,1799,1802],{},[1374,1792,1793],{},"1",[1374,1795,1796],{},"9",[1374,1798,1793],{},[1374,1800,1801],{},"index 1 with itself (no change)",[1374,1803,1804],{},[1112,1805,1788],{},[1359,1807,1808,1811,1814,1817,1820],{},[1374,1809,1810],{},"2",[1374,1812,1813],{},"11",[1374,1815,1816],{},"4",[1374,1818,1819],{},"index 2 and index 4",[1374,1821,1822],{},[1112,1823,1824],{},"{6, 9, 11, 14, 21}",[1359,1826,1827,1829,1832,1834,1837],{},[1374,1828,1780],{},[1374,1830,1831],{},"14",[1374,1833,1780],{},[1374,1835,1836],{},"index 3 with itself (no change)",[1374,1838,1839],{},[1112,1840,1824],{},[1080,1842,1843,1844,1846,1847,1849],{},"After pass ",[1112,1845,1233],{},", everything from index 0 through ",[1112,1848,1233],{}," is in its final spot. In passes 1 and 3 the smallest value was already in place, so the swap didn't change anything. The inner loop still scanned the whole unsorted part to find that out. That's why selection sort does the same amount of scanning no matter how the data starts out.",[1080,1851,1852,1853,1856],{},"There are only 4 passes for 5 elements, because the outer loop stops at ",[1112,1854,1855],{},"times.length - 1",". Once the first four positions are correct, the last element has to be the largest.",[1087,1858,1860],{"id":1859},"step-3-insertion-sort","Step 3: Insertion Sort",[1105,1862,1864],{"className":1107,"code":1863,"language":1109,"meta":1110,"style":1110},"public static void insertionSort(int[] times)\n{\n    for (int j = 1; j \u003C times.length; j++)\n    {\n        int temp = times[j];\n        int possibleIndex = j;\n        while (possibleIndex > 0 && temp \u003C times[possibleIndex - 1])\n        {\n            times[possibleIndex] = times[possibleIndex - 1]; \u002F\u002F shift right\n            possibleIndex--;\n        }\n        times[possibleIndex] = temp;\n    }\n}\n",[1112,1865,1866,1871,1875,1880,1884,1888,1892,1897,1901,1906,1910,1914,1919,1923],{"__ignoreMap":1110},[1115,1867,1868],{"class":1117,"line":1118},[1115,1869,1870],{},"public static void insertionSort(int[] times)\n",[1115,1872,1873],{"class":1117,"line":1124},[1115,1874,1127],{},[1115,1876,1877],{"class":1117,"line":1130},[1115,1878,1879],{},"    for (int j = 1; j \u003C times.length; j++)\n",[1115,1881,1882],{"class":1117,"line":1136},[1115,1883,1139],{},[1115,1885,1886],{"class":1117,"line":1142},[1115,1887,1704],{},[1115,1889,1890],{"class":1117,"line":1148},[1115,1891,1279],{},[1115,1893,1894],{"class":1117,"line":1154},[1115,1895,1896],{},"        while (possibleIndex > 0 && temp \u003C times[possibleIndex - 1])\n",[1115,1898,1899],{"class":1117,"line":1160},[1115,1900,1163],{},[1115,1902,1903],{"class":1117,"line":1166},[1115,1904,1905],{},"            times[possibleIndex] = times[possibleIndex - 1]; \u002F\u002F shift right\n",[1115,1907,1908],{"class":1117,"line":1172},[1115,1909,1303],{},[1115,1911,1912],{"class":1117,"line":1178},[1115,1913,1193],{},[1115,1915,1916],{"class":1117,"line":1184},[1115,1917,1918],{},"        times[possibleIndex] = temp;\n",[1115,1920,1921],{"class":1117,"line":1190},[1115,1922,1217],{},[1115,1924,1925],{"class":1117,"line":1196},[1115,1926,1223],{},[1080,1928,1929,1930,1933],{},"The array after each pass of the outer loop, starting over from ",[1112,1931,1932],{},"cycleTimesCopy",":",[1353,1935,1936,1957],{},[1356,1937,1938],{},[1359,1939,1940,1944,1949,1952,1955],{},[1362,1941,1734,1942,1737],{},[1112,1943,1233],{},[1362,1945,1946],{},[1112,1947,1948],{},"temp",[1362,1950,1951],{},"Shifts",[1362,1953,1954],{},"Placed at",[1362,1956,1751],{},[1369,1958,1959,1973,1990,2006,2022],{},[1359,1960,1961,1963,1965,1967,1969],{},[1374,1962,1758],{},[1374,1964],{},[1374,1966],{},[1374,1968],{},[1374,1970,1971],{},[1112,1972,1769],{},[1359,1974,1975,1977,1979,1982,1985],{},[1374,1976,1793],{},[1374,1978,1796],{},[1374,1980,1981],{},"1 (14)",[1374,1983,1984],{},"index 0",[1374,1986,1987],{},[1112,1988,1989],{},"{9, 14, 21, 6, 11}",[1359,1991,1992,1994,1997,1999,2002],{},[1374,1993,1810],{},[1374,1995,1996],{},"21",[1374,1998,1774],{},[1374,2000,2001],{},"index 2",[1374,2003,2004],{},[1112,2005,1989],{},[1359,2007,2008,2010,2012,2015,2017],{},[1374,2009,1780],{},[1374,2011,1777],{},[1374,2013,2014],{},"3 (21, 14, 9)",[1374,2016,1984],{},[1374,2018,2019],{},[1112,2020,2021],{},"{6, 9, 14, 21, 11}",[1359,2023,2024,2026,2028,2031,2033],{},[1374,2025,1816],{},[1374,2027,1813],{},[1374,2029,2030],{},"2 (21, 14)",[1374,2032,2001],{},[1374,2034,2035],{},[1112,2036,1824],{},[1080,2038,1843,2039,2041,2042,2044,2045,2047,2048,2050,2051,2053,2054,2057,2058,2061,2062,2064],{},[1112,2040,1233],{},", indexes 0 through ",[1112,2043,1233],{}," are sorted relative to each other, but they aren't necessarily in their final spots yet. In pass 3, ",[1112,2046,1777],{}," goes to the front and pushes ",[1112,2049,1796],{}," and ",[1112,2052,1831],{}," to new positions. The outer loop starts at ",[1112,2055,2056],{},"j = 1"," and runs while ",[1112,2059,2060],{},"j \u003C times.length",", so the last element (",[1112,2063,1813],{},", in pass 4) does get inserted.",[1087,2066,2068],{"id":2067},"step-4-compare","Step 4: Compare",[1105,2070,2072],{"className":1107,"code":2071,"language":1109,"meta":1110,"style":1110},"selectionSort(cycleTimes);\ninsertionSort(cycleTimesCopy);\nfor (int time : cycleTimes)\n{\n    System.out.print(time + \" \");\n}\nSystem.out.println(); \u002F\u002F 6 9 11 14 21\nfor (int time : cycleTimesCopy)\n{\n    System.out.print(time + \" \");\n}\nSystem.out.println(); \u002F\u002F 6 9 11 14 21\n",[1112,2073,2074,2079,2084,2089,2093,2098,2102,2107,2112,2116,2120,2124],{"__ignoreMap":1110},[1115,2075,2076],{"class":1117,"line":1118},[1115,2077,2078],{},"selectionSort(cycleTimes);\n",[1115,2080,2081],{"class":1117,"line":1124},[1115,2082,2083],{},"insertionSort(cycleTimesCopy);\n",[1115,2085,2086],{"class":1117,"line":1130},[1115,2087,2088],{},"for (int time : cycleTimes)\n",[1115,2090,2091],{"class":1117,"line":1136},[1115,2092,1127],{},[1115,2094,2095],{"class":1117,"line":1142},[1115,2096,2097],{},"    System.out.print(time + \" \");\n",[1115,2099,2100],{"class":1117,"line":1148},[1115,2101,1223],{},[1115,2103,2104],{"class":1117,"line":1154},[1115,2105,2106],{},"System.out.println(); \u002F\u002F 6 9 11 14 21\n",[1115,2108,2109],{"class":1117,"line":1160},[1115,2110,2111],{},"for (int time : cycleTimesCopy)\n",[1115,2113,2114],{"class":1117,"line":1166},[1115,2115,1127],{},[1115,2117,2118],{"class":1117,"line":1172},[1115,2119,2097],{},[1115,2121,2122],{"class":1117,"line":1178},[1115,2123,1223],{},[1115,2125,2126],{"class":1117,"line":1184},[1115,2127,2106],{},[1080,2129,2130],{},"Both sorts give the same result by different routes:",[1507,2132,2133,2136,2139],{},[1510,2134,2135],{},"Selection sort puts one value in its final position on each pass, by searching for the minimum and swapping it in.",[1510,2137,2138],{},"Insertion sort keeps a sorted section on the left and grows it by one on each pass, shifting larger values right to make room.",[1510,2140,2141,2142,2144,2145,2147],{},"In insertion sort's pass 2, ",[1112,2143,1996],{}," was already larger than everything to its left, so the ",[1112,2146,1335],{}," loop stopped right away with 0 shifts. That early stop is what makes insertion sort adaptive. On data that's already nearly sorted, most passes look like that one.",[1087,2149,2151],{"id":2150},"recap","Recap",[1507,2153,2154,2157,2170,2182],{},[1510,2155,2156],{},"Selection sort: the outer loop picks the position to fill, the inner loop finds the smallest remaining value, and a swap puts it there. It does the same scanning whatever the starting order is.",[1510,2158,2159,2160,2163,2164,2166,2167,2169],{},"Insertion sort: take ",[1112,2161,2162],{},"times[j]"," as ",[1112,2165,1948],{},", shift larger values to the right, and drop ",[1112,2168,1948],{}," into the gap. Values that are already in order cause little or no shifting.",[1510,2171,2172,2173,2175,2176,2178,2179,2181],{},"Selection sort's outer loop can stop at ",[1112,2174,1531],{},". Insertion sort's outer loop must run through ",[1112,2177,1531],{}," inclusive (",[1112,2180,1527],{},"), or the last element is never inserted.",[1510,2183,2184],{},"Tracing the array after each pass is the most reliable way to check a sort by hand.",[1572,2186,1574],{},{"title":1110,"searchDepth":1124,"depth":1124,"links":2188},[2189,2190,2191,2192,2193,2194],{"id":1599,"depth":1124,"text":1600},{"id":1606,"depth":1124,"text":1607},{"id":1640,"depth":1124,"text":1641},{"id":1859,"depth":1124,"text":1860},{"id":2067,"depth":1124,"text":2068},{"id":2150,"depth":1124,"text":2151},{"outlineRef":1586,"pairsWith":2196,"status":2197},"[`lessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms.md`](..\u002F..\u002Flessons\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms.md)","new — authored worked example (fully solved, walked step by step — not a problem to attempt)",{"title":743,"description":1110},"YXGVBCz4Tmm3668ezBHzHJjc4gijWsjEZiZQdnREPGY",{"id":2201,"title":1060,"body":2202,"description":1110,"extension":1584,"meta":3054,"navigation":1430,"path":1059,"seo":3056,"stem":1061,"__hash__":3057},"exercises\u002Fshockwave-curriculum\u002Fexercises\u002Fch28-algorithms-searching-sorting-recursion\u002F28.2-sorting-algorithms.md",{"type":1073,"value":2203,"toc":3049},[2204,2207,2211,2227,2236,2241,2267,2273,2299,2338,2342,2372,2375,2443,2448,2454,2596,2681,2685,2691,2712,2715,2742,2751,2756,2792,2797,2911,2916,3016,3047],[1076,2205,1060],{"id":2206},"sorting-algorithms-exercises",[1087,2208,2210],{"id":2209},"multiple-choice","Multiple Choice",[1080,2212,2213,2216,2217,2220,2221,2050,2224,2226],{},[1083,2214,2215],{},"Question:"," The lesson's selection sort is run on an array of shooter spin-up times (in hundredths of a second). What does the array look like after the first ",[1083,2218,2219],{},"two"," passes of the outer loop (",[1112,2222,2223],{},"j = 0",[1112,2225,2056],{},")?",[1105,2228,2230],{"className":1107,"code":2229,"language":1109,"meta":1110,"style":1110},"int[] spinUpTimes = {31, 19, 42, 8, 3};\n",[1112,2231,2232],{"__ignoreMap":1110},[1115,2233,2234],{"class":1117,"line":1118},[1115,2235,2229],{},[1080,2237,2238],{},[1083,2239,2240],{},"Options:",[1507,2242,2243,2249,2255,2261],{},[1510,2244,2245,2246],{},"A. ",[1112,2247,2248],{},"{3, 8, 42, 19, 31}",[1510,2250,2251,2252],{},"B. ",[1112,2253,2254],{},"{3, 8, 19, 31, 42}",[1510,2256,2257,2258],{},"C. ",[1112,2259,2260],{},"{19, 31, 42, 8, 3}",[1510,2262,2263,2264],{},"D. ",[1112,2265,2266],{},"{3, 8, 31, 19, 42}",[1080,2268,2269,2272],{},[1083,2270,2271],{},"Answer:"," A",[1080,2274,2275,2278,2279,2281,2282,2284,2285,2288,2289,2291,2292,2295,2296,2298],{},[1083,2276,2277],{},"Why:"," In pass ",[1112,2280,2223],{},", the smallest value in the whole array is ",[1112,2283,1780],{},", at index 4. It swaps with index 0, giving ",[1112,2286,2287],{},"{3, 19, 42, 8, 31}",". In pass ",[1112,2290,2056],{},", the smallest value from index 1 onward is ",[1112,2293,2294],{},"8",", at index 3. It swaps with index 1, giving ",[1112,2297,2248],{},". Each pass puts exactly one value into its final position and swaps whatever was there into the old spot of the minimum. The rest of the array doesn't get tidied up along the way.",[1507,2300,2301,2304,2324],{},[1510,2302,2303],{},"B is wrong. That's the fully sorted array, which selection sort only reaches after all four passes. Two passes fix only the first two positions.",[1510,2305,2306,2307,2311,2312,2315,2316,2319,2320,2323],{},"C is wrong. That's what the first two passes of ",[2308,2309,2310],"em",{},"insertion"," sort produce: ",[1112,2313,2314],{},"19"," is inserted in front of ",[1112,2317,2318],{},"31",", and then ",[1112,2321,2322],{},"42"," stays where it is.",[1510,2325,2326,2327,2330,2331,2334,2335,2337],{},"D is wrong. That's what you'd get by ",[2308,2328,2329],{},"shifting"," each minimum into place and moving the other values right, like insertion sort does. Selection sort ",[2308,2332,2333],{},"swaps"," instead, so after pass 0 the ",[1112,2336,2318],{}," from index 0 ends up at index 4.",[1087,2339,2341],{"id":2340},"micro-parsons","Micro-Parsons",[1080,2343,2344,2347,2348,2351,2352,2355,2356,2359,2360,2363,2364,2367,2368,2371],{},[1083,2345,2346],{},"Problem:"," Given a ",[1112,2349,2350],{},"BatteryLog"," class with a ",[1112,2353,2354],{},"main"," method that creates ",[1112,2357,2358],{},"double[] batteryVoltages = {12.4, 11.9, 12.8, 12.1};",", calls ",[1112,2361,2362],{},"sortVoltages(batteryVoltages);",", and prints the result, plus the signature and braces of the ",[1112,2365,2366],{},"sortVoltages(double[] voltages)"," method, reorder the fragments below into the method body. The body should insertion-sort ",[1112,2369,2370],{},"voltages"," from lowest to highest.",[1080,2373,2374],{},"Reorder the fragments below to complete it:",[1507,2376,2377,2383,2389,2395,2401,2407,2413,2419,2425,2431,2437],{},[1510,2378,2379,2380],{},"a. ",[1112,2381,2382],{},"    while (possibleIndex > 0 && temp \u003C voltages[possibleIndex - 1])",[1510,2384,2385,2386],{},"b. ",[1112,2387,2388],{},"}",[1510,2390,2391,2392],{},"c. ",[1112,2393,2394],{},"        possibleIndex--;",[1510,2396,2397,2398],{},"d. ",[1112,2399,2400],{},"    double temp = voltages[j];",[1510,2402,2403,2404],{},"e. ",[1112,2405,2406],{},"for (int j = 1; j \u003C voltages.length; j++)",[1510,2408,2409,2410],{},"f. ",[1112,2411,2412],{},"    {",[1510,2414,2415,2416],{},"g. ",[1112,2417,2418],{},"    voltages[possibleIndex] = temp;",[1510,2420,2421,2422],{},"h. ",[1112,2423,2424],{},"        voltages[possibleIndex] = voltages[possibleIndex - 1];",[1510,2426,2427,2428],{},"i. ",[1112,2429,2430],{},"{",[1510,2432,2433,2434],{},"j. ",[1112,2435,2436],{},"    int possibleIndex = j;",[1510,2438,2439,2440],{},"k. ",[1112,2441,2442],{},"    }",[1080,2444,2445,2447],{},[1083,2446,2271],{}," e, i, d, j, a, f, h, c, k, g, b",[1080,2449,2450,2453],{},[1083,2451,2452],{},"Interchangeable:"," (d, j)",[1105,2455,2457],{"className":1107,"code":2456,"language":1109,"meta":1110,"style":1110},"public class BatteryLog\n{\n    public static void sortVoltages(double[] voltages)\n    {\n        for (int j = 1; j \u003C voltages.length; j++)\n        {\n            double temp = voltages[j];\n            int possibleIndex = j;\n            while (possibleIndex > 0 && temp \u003C voltages[possibleIndex - 1])\n            {\n                voltages[possibleIndex] = voltages[possibleIndex - 1];\n                possibleIndex--;\n            }\n            voltages[possibleIndex] = temp;\n        }\n    }\n\n    public static void main(String[] args)\n    {\n        double[] batteryVoltages = {12.4, 11.9, 12.8, 12.1};\n        sortVoltages(batteryVoltages);\n        for (double voltage : batteryVoltages)\n        {\n            System.out.print(voltage + \" \");\n        }\n        System.out.println();\n    }\n}\n",[1112,2458,2459,2464,2468,2473,2477,2482,2486,2491,2496,2501,2505,2510,2515,2519,2524,2528,2532,2536,2541,2546,2552,2558,2564,2569,2575,2580,2586,2591],{"__ignoreMap":1110},[1115,2460,2461],{"class":1117,"line":1118},[1115,2462,2463],{},"public class BatteryLog\n",[1115,2465,2466],{"class":1117,"line":1124},[1115,2467,1127],{},[1115,2469,2470],{"class":1117,"line":1130},[1115,2471,2472],{},"    public static void sortVoltages(double[] voltages)\n",[1115,2474,2475],{"class":1117,"line":1136},[1115,2476,1139],{},[1115,2478,2479],{"class":1117,"line":1142},[1115,2480,2481],{},"        for (int j = 1; j \u003C voltages.length; j++)\n",[1115,2483,2484],{"class":1117,"line":1148},[1115,2485,1163],{},[1115,2487,2488],{"class":1117,"line":1154},[1115,2489,2490],{},"            double temp = voltages[j];\n",[1115,2492,2493],{"class":1117,"line":1160},[1115,2494,2495],{},"            int possibleIndex = j;\n",[1115,2497,2498],{"class":1117,"line":1166},[1115,2499,2500],{},"            while (possibleIndex > 0 && temp \u003C voltages[possibleIndex - 1])\n",[1115,2502,2503],{"class":1117,"line":1172},[1115,2504,1175],{},[1115,2506,2507],{"class":1117,"line":1178},[1115,2508,2509],{},"                voltages[possibleIndex] = voltages[possibleIndex - 1];\n",[1115,2511,2512],{"class":1117,"line":1184},[1115,2513,2514],{},"                possibleIndex--;\n",[1115,2516,2517],{"class":1117,"line":1190},[1115,2518,1187],{},[1115,2520,2521],{"class":1117,"line":1196},[1115,2522,2523],{},"            voltages[possibleIndex] = temp;\n",[1115,2525,2526],{"class":1117,"line":1202},[1115,2527,1193],{},[1115,2529,2530],{"class":1117,"line":1208},[1115,2531,1217],{},[1115,2533,2534],{"class":1117,"line":1214},[1115,2535,1431],{"emptyLinePlaceholder":1430},[1115,2537,2538],{"class":1117,"line":1220},[1115,2539,2540],{},"    public static void main(String[] args)\n",[1115,2542,2544],{"class":1117,"line":2543},19,[1115,2545,1139],{},[1115,2547,2549],{"class":1117,"line":2548},20,[1115,2550,2551],{},"        double[] batteryVoltages = {12.4, 11.9, 12.8, 12.1};\n",[1115,2553,2555],{"class":1117,"line":2554},21,[1115,2556,2557],{},"        sortVoltages(batteryVoltages);\n",[1115,2559,2561],{"class":1117,"line":2560},22,[1115,2562,2563],{},"        for (double voltage : batteryVoltages)\n",[1115,2565,2567],{"class":1117,"line":2566},23,[1115,2568,1163],{},[1115,2570,2572],{"class":1117,"line":2571},24,[1115,2573,2574],{},"            System.out.print(voltage + \" \");\n",[1115,2576,2578],{"class":1117,"line":2577},25,[1115,2579,1193],{},[1115,2581,2583],{"class":1117,"line":2582},26,[1115,2584,2585],{},"        System.out.println();\n",[1115,2587,2589],{"class":1117,"line":2588},27,[1115,2590,1217],{},[1115,2592,2594],{"class":1117,"line":2593},28,[1115,2595,1223],{},[1080,2597,2598,2601,2602,2605,2606,2609,2610,2612,2613,1481,2615,2618,2619,1481,2622,2624,2625,2627,2628,2605,2631,2634,2635,2637,2638,2641,2642,1481,2645,2648,2649,2652,2653,2655,2656,2658,2659,2662,2663,2665,2666,2669,2670,2673,2674,2676,2677,2680],{},[1083,2599,2600],{},"Why this order:"," The outer loop (",[1112,2603,2604],{},"e",", ",[1112,2607,2608],{},"i",") starts at ",[1112,2611,2056],{},", because a single element at index 0 already counts as sorted. It runs through the last index so every element gets inserted. Inside it, the value being inserted is saved in ",[1112,2614,1948],{},[1112,2616,2617],{},"d",") and its starting position in ",[1112,2620,2621],{},"possibleIndex",[1112,2623,1233],{},"). Those two lines don't depend on each other, so they can go in either order. Both have to come before the ",[1112,2626,1335],{}," loop (",[1112,2629,2630],{},"a",[1112,2632,2633],{},"f","), because its condition reads both of them. Inside the ",[1112,2636,1335],{},", the shift (",[1112,2639,2640],{},"h",") must come before ",[1112,2643,2644],{},"possibleIndex--;",[1112,2646,2647],{},"c","), since the shift copies from ",[1112,2650,2651],{},"possibleIndex - 1"," into ",[1112,2654,2621],{}," and needs the current position. After the ",[1112,2657,1335],{}," closes (",[1112,2660,2661],{},"k","), ",[1112,2664,1948],{}," is written into the gap (",[1112,2667,2668],{},"g","). That step runs once per pass, after the shifting is done, and not once per shift. The outer loop's brace (",[1112,2671,2672],{},"b",") closes last. The class, ",[1112,2675,2354],{},", and the method's signature and braces are the given scaffold. The finished program prints ",[1112,2678,2679],{},"11.9 12.1 12.4 12.8 "," (with a trailing space).",[1087,2682,2684],{"id":2683},"coding","Coding",[1080,2686,2687,2690],{},[1083,2688,2689],{},"Mode:"," harness",[1080,2692,2693,2695,2696,2699,2700,2703,2704,2707,2708,2711],{},[1083,2694,2346],{}," A leaderboard needs scores from highest to lowest. Write ",[1112,2697,2698],{},"sortDescending"," using\n",[1083,2701,2702],{},"selection sort",": for each position from the front, find the ",[1083,2705,2706],{},"largest"," value in the part of the\narray not yet sorted and swap it into that position. Sort ",[1112,2709,2710],{},"scores"," in place and also return it.\nDuplicates are allowed, and the array may be empty.",[1080,2713,2714],{},"Examples:",[1507,2716,2717,2726,2734],{},[1510,2718,2719,2722,2723],{},[1112,2720,2721],{},"sortDescending(new int[] {3, 9, 1})"," returns ",[1112,2724,2725],{},"{9, 3, 1}",[1510,2727,2728,2722,2731],{},[1112,2729,2730],{},"sortDescending(new int[] {5})",[1112,2732,2733],{},"{5}",[1510,2735,2736,2722,2739],{},[1112,2737,2738],{},"sortDescending(new int[] {1, 2, 3})",[1112,2740,2741],{},"{3, 2, 1}",[1080,2743,2744,2747,2748],{},[1083,2745,2746],{},"Signature:"," ",[1112,2749,2750],{},"public static int[] sortDescending(int[] scores)",[1080,2752,2753],{},[1083,2754,2755],{},"Starter:",[1105,2757,2759],{"className":1107,"code":2758,"language":1109,"meta":1110,"style":1110},"public class Solution\n{\n    public static int[] sortDescending(int[] scores)\n    {\n        \u002F\u002F TODO: selection sort, largest first, then return scores\n    }\n}\n",[1112,2760,2761,2766,2770,2775,2779,2784,2788],{"__ignoreMap":1110},[1115,2762,2763],{"class":1117,"line":1118},[1115,2764,2765],{},"public class Solution\n",[1115,2767,2768],{"class":1117,"line":1124},[1115,2769,1127],{},[1115,2771,2772],{"class":1117,"line":1130},[1115,2773,2774],{},"    public static int[] sortDescending(int[] scores)\n",[1115,2776,2777],{"class":1117,"line":1136},[1115,2778,1139],{},[1115,2780,2781],{"class":1117,"line":1142},[1115,2782,2783],{},"        \u002F\u002F TODO: selection sort, largest first, then return scores\n",[1115,2785,2786],{"class":1117,"line":1148},[1115,2787,1217],{},[1115,2789,2790],{"class":1117,"line":1154},[1115,2791,1223],{},[1080,2793,2794],{},[1083,2795,2796],{},"Tests:",[1353,2798,2799,2812],{},[1356,2800,2801],{},[1359,2802,2803,2806,2809],{},[1362,2804,2805],{},"Visible",[1362,2807,2808],{},"Arguments",[1362,2810,2811],{},"Expected",[1369,2813,2814,2829,2842,2856,2870,2884,2898],{},[1359,2815,2816,2819,2824],{},[1374,2817,2818],{},"yes",[1374,2820,2821],{},[1112,2822,2823],{},"new int[] {3, 9, 1}",[1374,2825,2826],{},[1112,2827,2828],{},"new int[] {9, 3, 1}",[1359,2830,2831,2833,2838],{},[1374,2832,2818],{},[1374,2834,2835],{},[1112,2836,2837],{},"new int[] {5}",[1374,2839,2840],{},[1112,2841,2837],{},[1359,2843,2844,2846,2851],{},[1374,2845,2818],{},[1374,2847,2848],{},[1112,2849,2850],{},"new int[] {1, 2, 3}",[1374,2852,2853],{},[1112,2854,2855],{},"new int[] {3, 2, 1}",[1359,2857,2858,2861,2866],{},[1374,2859,2860],{},"no",[1374,2862,2863],{},[1112,2864,2865],{},"new int[] {3, 1, 2}",[1374,2867,2868],{},[1112,2869,2855],{},[1359,2871,2872,2874,2879],{},[1374,2873,2860],{},[1374,2875,2876],{},[1112,2877,2878],{},"new int[] {4, 4, 2, 4}",[1374,2880,2881],{},[1112,2882,2883],{},"new int[] {4, 4, 4, 2}",[1359,2885,2886,2888,2893],{},[1374,2887,2860],{},[1374,2889,2890],{},[1112,2891,2892],{},"new int[] {2, 8, 5, 8, 1}",[1374,2894,2895],{},[1112,2896,2897],{},"new int[] {8, 8, 5, 2, 1}",[1359,2899,2900,2902,2907],{},[1374,2901,2860],{},[1374,2903,2904],{},[1112,2905,2906],{},"new int[] {}",[1374,2908,2909],{},[1112,2910,2906],{},[1080,2912,2913],{},[1083,2914,2915],{},"Solution:",[1105,2917,2919],{"className":1107,"code":2918,"language":1109,"meta":1110,"style":1110},"public class Solution\n{\n    public static int[] sortDescending(int[] scores)\n    {\n        for (int j = 0; j \u003C scores.length - 1; j++)\n        {\n            int maxIndex = j;\n            for (int k = j + 1; k \u003C scores.length; k++)\n            {\n                if (scores[k] > scores[maxIndex])\n                {\n                    maxIndex = k;\n                }\n            }\n            int temp = scores[j];\n            scores[j] = scores[maxIndex];\n            scores[maxIndex] = temp;\n        }\n        return scores;\n    }\n}\n",[1112,2920,2921,2925,2929,2933,2937,2942,2946,2951,2956,2960,2965,2970,2975,2980,2984,2989,2994,2999,3003,3008,3012],{"__ignoreMap":1110},[1115,2922,2923],{"class":1117,"line":1118},[1115,2924,2765],{},[1115,2926,2927],{"class":1117,"line":1124},[1115,2928,1127],{},[1115,2930,2931],{"class":1117,"line":1130},[1115,2932,2774],{},[1115,2934,2935],{"class":1117,"line":1136},[1115,2936,1139],{},[1115,2938,2939],{"class":1117,"line":1142},[1115,2940,2941],{},"        for (int j = 0; j \u003C scores.length - 1; j++)\n",[1115,2943,2944],{"class":1117,"line":1148},[1115,2945,1163],{},[1115,2947,2948],{"class":1117,"line":1154},[1115,2949,2950],{},"            int maxIndex = j;\n",[1115,2952,2953],{"class":1117,"line":1160},[1115,2954,2955],{},"            for (int k = j + 1; k \u003C scores.length; k++)\n",[1115,2957,2958],{"class":1117,"line":1166},[1115,2959,1175],{},[1115,2961,2962],{"class":1117,"line":1172},[1115,2963,2964],{},"                if (scores[k] > scores[maxIndex])\n",[1115,2966,2967],{"class":1117,"line":1178},[1115,2968,2969],{},"                {\n",[1115,2971,2972],{"class":1117,"line":1184},[1115,2973,2974],{},"                    maxIndex = k;\n",[1115,2976,2977],{"class":1117,"line":1190},[1115,2978,2979],{},"                }\n",[1115,2981,2982],{"class":1117,"line":1196},[1115,2983,1187],{},[1115,2985,2986],{"class":1117,"line":1202},[1115,2987,2988],{},"            int temp = scores[j];\n",[1115,2990,2991],{"class":1117,"line":1208},[1115,2992,2993],{},"            scores[j] = scores[maxIndex];\n",[1115,2995,2996],{"class":1117,"line":1214},[1115,2997,2998],{},"            scores[maxIndex] = temp;\n",[1115,3000,3001],{"class":1117,"line":1220},[1115,3002,1193],{},[1115,3004,3005],{"class":1117,"line":2543},[1115,3006,3007],{},"        return scores;\n",[1115,3009,3010],{"class":1117,"line":2548},[1115,3011,1217],{},[1115,3013,3014],{"class":1117,"line":2554},[1115,3015,1223],{},[1080,3017,3018,3020,3021,3023,3024,3026,3027,3029,3030,3032,3033,3035,3036,3039,3040,3043,3044,3046],{},[1083,3019,2277],{}," This is the lesson's selection sort with the comparison flipped from \"smallest\" to\n\"largest\". The outer loop picks the position ",[1112,3022,1233],{}," to fill next; the inner loop starts at ",[1112,3025,1229],{},"\n(everything before ",[1112,3028,1233],{}," is already placed) and remembers the index of the largest value seen; then\none swap puts it in position ",[1112,3031,1233],{},". The outer loop stops at ",[1112,3034,1531],{}," because the last element is\nalready in place after the others are. Stopping one pass earlier (",[1112,3037,3038],{},"length - 2",") can leave the last\ntwo values swapped, as in ",[1112,3041,3042],{},"{3, 1, 2}",", which is why a hidden test uses it. ",[1112,3045,1531],{}," also makes\nthe empty array safe: the loop body never runs.",[1572,3048,1574],{},{"title":1110,"searchDepth":1124,"depth":1124,"links":3050},[3051,3052,3053],{"id":2209,"depth":1124,"text":2210},{"id":2340,"depth":1124,"text":2341},{"id":2683,"depth":1124,"text":2684},{"outlineRef":1586,"pairsWith":2196,"status":3055},"new — authored exercises (Multiple Choice + Micro-Parsons + Coding)",{"title":1060,"description":1110},"M_CJUZ4vASXsCWpV2if0jFNOWcAhxT2QLSYiJXNz_pI",1792718167003]