如何修复失效的Cocktail Sort(鸡尾酒排序)代码使其正常运行?
修复Cocktail Sort排序算法并完善功能
原代码中的Cocktail Sort无法正常工作,同时缺少触发按钮和交换次数统计,以下是修复后的完整代码及关键修改点:
关键修复点
- 修正反向遍历交换逻辑:原反向循环中错误交换了
numbers[j]与numbers[j+1],实际应交换numbers[j-1]与numbers[j] - 添加交换次数统计:每次执行交换操作时,对
swaps变量进行累加 - 新增触发按钮:在
setup函数中创建Cocktail Sort的触发按钮,绑定对应的排序函数 - 补充结果输出:排序完成后在控制台输出耗时和交换次数
修复后的完整代码
NUM_ELEMENTS = 500; numbers = []; function setup() { createCanvas(400, 300); for(i=0;i<=NUM_ELEMENTS;i++) { numbers.push(round(random(1,NUM_ELEMENTS))); } para1 = createElement("p","",); tempString = ""; for(i=0;i<=NUM_ELEMENTS;i++) { console.log(numbers[i]); tempString = tempString + numbers[i] + ","; } para1.html(tempString); button1 = createButton("Bubble Sort"); button1.mousePressed(bubbleSort); button2 = createButton("Selection Sort"); button2.mousePressed(selectionSort); button3 = createButton("Insertion Sort"); button3.mousePressed(insertionSort); button4 = createButton("Javascript Built-in Sort"); button4.mousePressed(bSort); // 新增Cocktail Sort按钮 button5 = createButton("Cocktail Sort"); button5.mousePressed(cocktailSort); } function bubbleSort() { total = 0 swaps = 0 t1 = millis(); console.log("sorting") let n = numbers.length; for(let i = 0; i < n; i++) { for(let j = 0; j < n; j++) { if(numbers[j] > numbers[j+1]){ let t = numbers[j]; numbers[j] = numbers[j+1]; numbers[j+1] = t; swaps = swaps + 1; } } } t2 = millis(); console.log(t2-t1); console.log("swaps :",swaps); } function selectionSort() { let n = numbers.length; console.log("Sorting...") total = 0 t1 = millis(); swaps = 0 for(let i = 0; i < n; i++) { let min = i; for(let j = i+1; j < n; j++){ if(numbers[j] < numbers[min]) { min=j; swaps = swaps + 1; } } if (min != i) { let tmp = numbers[i]; numbers[i] = numbers[min]; numbers[min] = tmp; swaps = swaps + 1; } } t2 = millis(); console.log(t2-t1); console.log("swaps :", swaps); } function insertionSort() { console.log("sorting"); t1 = millis(); swaps = 0; total = 0 let n = numbers.length; for (let i = 1; i < n; i++) { let current = numbers[i]; let j = i-1; while ((j > -1) && (current < numbers[j])) { numbers[j+1] = numbers[j]; swaps = swaps + 1; j--; } numbers[j+1] = current; } t2 = millis(); console.log(t2-t1); console.log("swaps : ", swaps); } function bSort() { console.log("Sorting...") total = 0 t1 = millis(); sort(numbers); t2 = millis(); console.log(t2-t1); console.log("swaps : unknown"); } function cocktailSort() { console.log("sorting...") total = 0 swaps = 0 t1 = millis(); let n = numbers.length; let sorted = false; while (!sorted) { sorted = true; // 正向遍历,将最大元素移到末尾 for (let i = 0; i < n - 1; i++) { if (numbers[i] > numbers[i + 1]){ let tmp = numbers[i]; numbers[i] = numbers[i + 1]; numbers[i+1] = tmp; swaps += 1; // 统计交换次数 sorted = false; } } if (sorted) break; sorted = true; // 反向遍历,将最小元素移到开头(修复交换逻辑) for (let j = n - 1; j > 0; j--) { if (numbers[j-1] > numbers[j]) { let tmp = numbers[j-1]; numbers[j-1] = numbers[j]; numbers[j] = tmp; swaps += 1; // 统计交换次数 sorted = false; } } } t2 = millis(); console.log(t2-t1); console.log("swaps :", swaps); // 输出交换次数 } function draw() { background(220); textSize(13); column = 10; row = 0; for (i=0;i<NUM_ELEMENTS;i++) { if (i%18==0) { column = column + 18; row = 0; } text(numbers[i],column,row*15+15); row++; } }
内容的提问来源于stack exchange,提问作者user21097900
相关产品推荐
相关产品推荐

