排序算法

57 阅读4分钟

1.排序算法

  • 排序算法是一种通过特定的运算规律将一组或多组数据按照既定模式进行重新排序的算法

2.排序算法的作用

  • 使用排序算法的主要目的是为了提高程序效率和提升查找的精准度
  • 这有助于提高程序的效率和性能,减少计算时间和计算资源的使用

3.常见的排序算法

  • 常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、桶排序、基数排序等

4.实现冒泡排序

概念

  1. 冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
  2. 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

原理

  • 冒泡排序的原理是通过重复走访要排序的元素列,依次比较相邻的两个元素,如果顺序错误就进行交换。这个过程会重复进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

代码

var arr = [6,5,7,4,3];
 
for(var i=0;i<arr.length-1;i++){
    for(var j=0;j<arr.length-1-i;j++){
        //找出最小的值,放前面
        if(arr[j]>arr[j+1]){
            var temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
        }
    }
}
//记忆口诀:
// 1.外层循环-1
// 2.内层循环-1又-i
// 3.内循环相邻比较大小
// 4.邻里交互位置

5.实现选择排序

原理

  • 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕
  • 依次找到最小(大)值,放到数组中

代码

var arr = [6, 5, 7, 4, 3];

for (var i = 0; i < arr.length - 1; i++) {
    //每一次外层循环都定义i索引的这个值为最小值
    var index = i;
    for (var j = i + 1; j < arr.length; j++) {
        if (arr[index] > arr[j]) {
            index = j; //找到了最小值懂的下标
        }
    }
    //找出的最小值跟i进行换位置
    var temp = arr[index];
    arr[index] = arr[i];
    arr[i] = temp;
}

6.实现快速排序

原理

  • 通过分治的方式来将一个数组排序。具体来说,它首先要把数列分成两个部分,并保证前一个子数列中的数都小于后一个子数列中的数。这是通过一个称为“基准”的元素来实现的,所有比基准小的元素都被放在基准的前面,所有比基准大的元素都被放在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个过程可以递归地应用于两个子数列,直到整个数列完全有序。

步骤

  1. 选择基准数:选择一个基准数,通常选择第一个元素或者最后一个元素。
  2. 分割数据:从最左边开始,将小于基准数的元素交换到前面,大于等于基准数的元素交换到后面。这个过程称为分割,完成后基准数就在其排序后的正确位置上。
  3. 递归排序:然后对分割出来的两个子数组进行同样的分割和排序操作,直到所有子数组的长度为1或0,即所有元素都已经在正确的位置上。

代码

var arr = [6, 5, 7, 4, 3];
//1.定义一个方法,输入一个数组
function quickSort(arr){
    //2.如果数组的额长度小于2,就返回输入的数组(小于2个,没办法比较)
    if(arr.length < 2){ //临界点
        return arr; //返回数组
    }
    //3.如果是大于等于2,找出下标,遇到不能被整除,向下取整
    var middleIndex = parseInt(arr.length/2);
    //4.通过中间下标,得到中间数,并且要从原来数组'扣'出来
    var middleVal = arr.splice(middleIndex,1);
    //5.准备2个空数组,左边和右边的空数组
    var left = [],right = [];
    //6.大于中间数 放置 右边数组 ,否则放置左边数组
    for(var i = 0;i<arr.length;i++){
        if(arr[i]>middleVal){
            right.push(arr[i]);
        }else{
            left.push(arr[i]);
        }
    }
    //7.递归进行继续拆,拆到只有一个数的数组,就不拆
    // 进行合并 左边数组 + 中间+ 右边数组
    return quickSort(left).concat(middleVal,quickSort(right))
} 
console.log(quickSort(arr));