微信扫一扫打赏支持

算法疑难(js实现)---1、快速排序

算法疑难(js实现)---1、快速排序

一、总结

一句话总结:

快排就是将数列按照基准数分成左(左区间都比基准数小)右(右区间都比基准数大)两个区间,对左右区间递归快排,直到区间只有一个数,这样区间就全部有序了,然后将全部有序的区间合并起来就得到排序好的结果
 1 function quickSort(arr) {
 2     //1、找基准数,并且将比基准数小的全部放到左边(左数组),
 3     // 大于等于基准数的全部放到右边(右数组)
 4     let base_num=arr[0];//基准数
 5     let left_arr=[];//左数组
 6     let right_arr=[];//右数组
 7     for (let i=1;i<arr.length;i++){
 8         //比基准数小的都放在左数组,否则放在右数组
 9         if(arr[i]<base_num){
10             left_arr.push(arr[i]);
11         }else{
12             right_arr.push(arr[i]);
13         }
14     }
15 
16     //2、对左右数组分别进行快排,返回排序好的左右数组
17     // (条件:就是数组中的元素要大于等于2个)
18     if(left_arr.length>=2) left_arr=quickSort(left_arr);
19     if(right_arr.length>=2) right_arr=quickSort(right_arr);
20     //快排之后的left_arr和right_arr 都是有序
21 
22     //3、合并排序好之后的左数组、基准数、排序好的右数组,并且返回
23     return left_arr.concat(base_num,right_arr);
24 }

 

 

1、快排的思路?

1、拆分区间:先从数列中取出一个数作为基准数,将比这个数小的全放到它的左边,大于或等于它的数全放到它的右边
2、递归:再对左右区间重复第1步,直到各区间只有一个数,区间只有一个数,这样区间就有序了
3、合并区间:将有序的区间合并起来,这样整个数列就有序了

 

 

 

二、快速排序

博客对应课程的视频位置:1、快速排序
https://www.fanrenyi.com/video/20/173

 

 

 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>快速排序</title>
 6 </head>
 7 <body>
 8 <!--
 9 快速排序的思路:
10 1、先从数列中取出一个数作为基准数
11 2、将比这个数小的全放到它的左边,大于或等于它的数全放到它的右边
12 3、再对左右区间重复第二步,直到各区间只有一个数
13 4、将有序的区间合并起来,这样整个数列就有序了
14 
15 let arr=[31,23,34,2,13,234];
16 
17 第一步:比如取第一个数为基准数,比31小的都放31左边,比31大的都放到31的右边
18 
19 23,2,13,  31  ,34,234
20 
21 第二步:对31 左右两边的数组都做同样的操作:选基准数,比基准数小的放左边,比基准数大的放右边
22 左边:[23,2,13]:选23为基准:2,13,  23
23 
24 右边:[34,234]:选34为基准:34,  234
25 2,13,23,31,34,234
26 
27 -->
28 <script>
29     let arr=[31,23,34,2,13,234,31,43,343,65,23,43,13,2];
30 
31     function quickSort(arr) {
32         //1、找基准数,并且将比基准数小的全部放到左边(左数组),
33         // 大于等于基准数的全部放到右边(右数组)
34         let base_num=arr[0];//基准数
35         let left_arr=[];//左数组
36         let right_arr=[];//右数组
37         for (let i=1;i<arr.length;i++){
38             //比基准数小的都放在左数组,否则放在右数组
39             if(arr[i]<base_num){
40                 left_arr.push(arr[i]);
41             }else{
42                 right_arr.push(arr[i]);
43             }
44         }
45 
46 
47         //2、对左右数组分别进行快排,返回排序好的左右数组
48         // (条件:就是数组中的元素要大于等于2个)
49         if(left_arr.length>=2) left_arr=quickSort(left_arr);
50         if(right_arr.length>=2) right_arr=quickSort(right_arr);
51         //快排之后的left_arr和right_arr 都是有序
52 
53 
54         //3、合并排序好之后的左数组、基准数、排序好的右数组,并且返回
55         return left_arr.concat(base_num,right_arr);
56 
57     }
58     let ans=quickSort(arr);
59     console.log(ans);
60 </script>
61 </body>
62 </html>

 

 

 

 

 

 
posted @ 2020-03-18 14:46  范仁义  阅读(237)  评论(0编辑  收藏  举报