三种基础排序算法(选择排序、插入排序、冒泡排序)
2018-01-26 17:02
1051 查看
注:
图片转自点击打开链接
以下均使用升序介绍。
选择排序:
从数组中找到最小的元素,和第一个位置的元素互换。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/05/d84ea236120575ffb89668717445d3b3)
从第二个位置开始,找到最小的元素,和第二个位置的元素互换。
........
直到选出array.length-1个较小元素,剩下的最大的元素自动排在最后一位。
代码实现:
衍生算法:
[b]双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方)。
代码实现:
[b]插入排序:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/05/89e4eb8af77608ff239e90445a372036)
从第二个元素开始,将当前元素插入到前面对应位置,使当前元素i
和之前元素形成有序数组。
比较规则:
正常:
从第一个元素开始,若当前元素i小于有序数组中的元素j,则从该元素开始将有序数组依次后移一位,
并将当前元素i放置到该元素j位置。(插入)
简易:
从有序数组最后一个元素开始,若当前元素i小于该元素j,则交换当前元素和该元素。
简易版代码实现:
冒泡排序:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/05/ae5b9b031783fb6e1693b33dab10462c)
从前往后,依次比较相邻的两个数,把较大的数放到后面。一次循环,可以在当前最末尾位置得到一个当前最大值。
代码实现:
[b]代码优化:
在某些时候,循环还未终止,整个数组已经排好序,此时应及时终止循环。
(冒泡每次都会比较相邻两个数并交换次序不对的组,若一次循环后,都没进行交换,则已经完成排序)
优化代码实现:
[b]鸡尾酒排序:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/05/fff2f4dce2be426183cb820fcf27b36c)
鸡尾酒是冒泡排序的升级版,该排序从左往右找出最大值后,再从右往左
找出最小值,类似鸡尾酒搅拌左右循环。在某些情况下,优于冒泡排序,
以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )
次序列就可以完成排序,但如果使用冒泡排序则需要四次。
代码实现:
图片转自点击打开链接
以下均使用升序介绍。
选择排序:
从数组中找到最小的元素,和第一个位置的元素互换。
从第二个位置开始,找到最小的元素,和第二个位置的元素互换。
........
直到选出array.length-1个较小元素,剩下的最大的元素自动排在最后一位。
代码实现:
public class Selection { public static void sort(int[] arr){ for(int i=0; i<arr.length-1; i++) { int minPos = i; for (int j = i; j < arr.length; j++) { if (arr[j] < arr[minPos]) { minPos = j;//找出当前最小元素的位置 } } if(arr[minPos]!=arr[i]) { swap(arr,minPos,i); } } } public static void swap(int[] arr,int a,int b){ int temp = arr[a]; arr[a] = arr; arr[b] = temp; } }
衍生算法:
[b]双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方)。
代码实现:
public class Selection { public static void doubleSort(int[] arr){ for(int i=0; i<arr.length/2-1; i++) { int minPos = i,maxPos = arr.length -i -1; for (int j = i; j < arr.length -i; j++) { if (arr[j] < arr[minPos]) { minPos = j; } if(arr[maxPos] <arr[j]){ maxPos = j; } } if(i!=minPos) { swap(arr,i,minPos);//(1) } if(maxPos!=arr.length - i - 1) { if (maxPos == i){//若当前最大值在循环起始位置,则最大值一定在(1)处被交换到了minPos的位置 maxPos = minPos; } swap(arr,maxPos,arr.length -i -1); } } } public static void swap(int[] arr,int a,int b){ int temp = arr[a]; arr[a] = arr; arr[b] = temp; } }
[b]插入排序:
从第二个元素开始,将当前元素插入到前面对应位置,使当前元素i
和之前元素形成有序数组。
比较规则:
正常:
从第一个元素开始,若当前元素i小于有序数组中的元素j,则从该元素开始将有序数组依次后移一位,
并将当前元素i放置到该元素j位置。(插入)
简易:
从有序数组最后一个元素开始,若当前元素i小于该元素j,则交换当前元素和该元素。
简易版代码实现:
public class Insertion { public static void sort(int[] arr){ int pos,temp; for(int i=1;i<arr.length;i++){ pos = i; while(pos!=0&&arr[pos]<arr[pos-1]){ temp = arr[pos]; arr[pos] = arr[pos-1]; arr[pos-1] = temp; pos--; } } } }
冒泡排序:
从前往后,依次比较相邻的两个数,把较大的数放到后面。一次循环,可以在当前最末尾位置得到一个当前最大值。
代码实现:
public class Bubble { public static void sort(int[] arr){ int temp; //依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位... for(int i = 0;i < arr.length-1;i++){ //从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较 for(int j = 0;j < arr.length-1-i;j++){ if(arr[j]>arr[j+1]) { swap(arr,j,j+1); changed = true; } } } } public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr; arr[b] = temp; } }
[b]代码优化:
在某些时候,循环还未终止,整个数组已经排好序,此时应及时终止循环。
(冒泡每次都会比较相邻两个数并交换次序不对的组,若一次循环后,都没进行交换,则已经完成排序)
优化代码实现:
public class Bubble { public static void sort(int[] arr){ int temp; boolean changed; for(int i = 0;i < arr.length-1;i++){ changed = false; for(int j = 0;j < arr.length-1-i;j++){ if(arr[j]>arr[j+1]) { swap(arr,j,j+1); changed = true; } } if(!changed){ break; } } } public static void swap(int []arr,int a ,int b){ int temp=arr[a]; arr[a] = arr; arr[b] = temp; } }
[b]鸡尾酒排序:
鸡尾酒是冒泡排序的升级版,该排序从左往右找出最大值后,再从右往左
找出最小值,类似鸡尾酒搅拌左右循环。在某些情况下,优于冒泡排序,
以序列(2,3,4,5,1)为例,鸡尾酒排序只需要访问两次(升序降序各一次 )
次序列就可以完成排序,但如果使用冒泡排序则需要四次。
代码实现:
public class CockTail { public static void sort(int[] arr){ //依次将最大的数放置到数组末尾,将第二大的数放到倒数第二位... boolean changed; for(int i = 0;i < arr.length/2;i++){ changed = false; //从前往后,比较相邻两个数,把大的放在后边.之前已放置成功的可以不再参与比较 for(int j = i;j < arr.length-1-i;j++){ if(arr[j]>arr[j+1]) { swap(arr,j,j+1); changed =true; } } if(!changed){ break; } for(int j = arr.length-1-i; j > i; j--){ if(arr[j]<arr[j-1]) { swap(arr,j,j-1); changed = true; } } if(!changed){ break; } } } public static void swap(int[] arr, int pos1, int pos2){ int temp = arr[pos1]; arr[pos1] = arr[pos2]; arr[pos2] = temp; } }
相关文章推荐
- 基础排序算法(冒泡排序、选择排序、插入排序)
- 三种基本排序算法-冒泡排序,选择排序,插入排序
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
- 三种数组排序算法(冒泡排序、选择排序、插入排序、二分查找法)
- 黑马程序员——java基础排序算法:选择排序、冒泡排序和插入排序
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
- 面试最基本的三种排序算法 冒泡排序 插入排序 选择排序
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- C#实现的3种排序算法--冒泡排序、选择排序、插入排序
- 三种简单排序用java实现(选择排序,冒泡排序,插入排序)
- 三个基本排序算法执行效率比较(冒泡排序,选择排序和插入排序)
- C#实现的3种排序算法--冒泡排序、选择排序、插入排序
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- JAVA中排序算法(冒泡排序、选择排序、插入排序、快速排序)
- 【算法基础】冒泡、选择、插入排序(三种基本排序)
- 排序算法(冒泡排序、选择排序、插入排序)
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序