java学习笔记之一些简单排序
来源:互联网 发布:自学编程先学什么 编辑:程序博客网 时间:2024/05/16 04:59
冒泡排序:
思想:(1)对数组中的的个数据,依次比较相邻的两个元素的大小
(2)如果前面的数据大于后面的数据,那么交换这两个数据
(3)用同样的方法,将剩下的数据逐一比较
平均的时间复杂度是:O(n^2) 最坏:O(n^2)
选择排序:
思想:
(1)将原始数组中选择一个最小的数据,将其和第一个位置的数据交换
(2)接着从剩下的n-1个数据中选择次小的数据,将其和第二个位置交换
(3)然后不断重复上述过程,知道最后两个数据不再交换
思想:
(缩小增量排序)
(1)将n个元素的数组分成n/2个数字序列,第一个数据和第n/2+1为一对......
(2)一次循环使得每个序列对排好序
(3)然后变成n/4个序列,再次排序
(4)不断重复上述过程,随着序列减少变为最后一个,也就完成了排序
平均时间复杂度:O(n^3/2) 最坏:O(n^2)
快速排序:
思想:
(1)首先设定一个分界值,以分界值将数据分为左右两部分
(2)将大于分界值的放在数组的右侧,小于分界值的放在数组的左侧
(3)然后,左边和右边的数据独立排序,对于左侧的的数据又可以取一个分界值,将其有分成左右两个部分,同样左边放置较小值,右边放置较大值,右侧的数组也是进行同样的操作。
(4)重复以上操作,可以看出这是一个递归定义,通过将左侧部分排好序后,再递归排好右侧部分顺序,左右两部分的数据排好序后,整个数组也就完成了整个数组的排序
平均时间复杂度:O(nlogn) 最坏:O(n^2)
归并排序:
思想:
将含有n个待排序的数据序列看成n个长度为1的有序子表组成,将其依次两两合并然后再对其两两合.....重复这个过程,直到最后长度为n;
平均时间复杂度:O(nlogn)最坏:O(nlogn)
桶排序O(n)、基数排序O(dn) ----d实常数
不稳定的排序:
快速排序、希尔排序、堆排序O(nlogn)、选择排序
思想:(1)对数组中的的个数据,依次比较相邻的两个元素的大小
(2)如果前面的数据大于后面的数据,那么交换这两个数据
(3)用同样的方法,将剩下的数据逐一比较
平均的时间复杂度是:O(n^2) 最坏:O(n^2)
public void bubbleSort(int []array){for(int i = 1;i<array.length;i++){for(int j =0;j<array.length-i;j++){if(array[j]>array[j+1]){int temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}}
选择排序:
思想:
(1)将原始数组中选择一个最小的数据,将其和第一个位置的数据交换
(2)接着从剩下的n-1个数据中选择次小的数据,将其和第二个位置交换
(3)然后不断重复上述过程,知道最后两个数据不再交换
平均时间复杂度:O(n^2)最坏:O(n^2)
public void selectSort(int []array){for(int i = 0;i<array.length-1;i++){int index =i;for(int j =i+1;j<array.length;j++){if(array[j]<array[index]){index = j;}}if(index!=i){int temp = array[i];array[i] = array[index];array[index] = temp;}}}
插入排序:
思想:
(1)首先对数组的前两个数据进行从小到大的排序
(2)接着第3个数据和前两个数据进行比较,将第3个位置插入到合适的位置
(3)然后第4个进行第三步
(4)不断重复,知道最后一个数据插入到合适的位置
平均时间复杂度:O(n^2)最坏:O(n^2)
public void insertSort(int []array){for(int i=1;i<array.length;i++){int t = array[i];int j = i-1;while(j>=0&&t<array[j]){array[j+1] =array[j];j--;}array[j+1] = t;}}希尔排序:
思想:
(缩小增量排序)
(1)将n个元素的数组分成n/2个数字序列,第一个数据和第n/2+1为一对......
(2)一次循环使得每个序列对排好序
(3)然后变成n/4个序列,再次排序
(4)不断重复上述过程,随着序列减少变为最后一个,也就完成了排序
平均时间复杂度:O(n^3/2) 最坏:O(n^2)
public void shellSort(int []array){for(int r = array.length;r>=1;r/=2){for(int i = r;i<array.length;i++){int temp = array[i];int j = i-r;while(j>=0&&temp<array[j]){array[j+r] = array[j];j-=r;}array[j+r] =temp;}}}
快速排序:
思想:
(1)首先设定一个分界值,以分界值将数据分为左右两部分
(2)将大于分界值的放在数组的右侧,小于分界值的放在数组的左侧
(3)然后,左边和右边的数据独立排序,对于左侧的的数据又可以取一个分界值,将其有分成左右两个部分,同样左边放置较小值,右边放置较大值,右侧的数组也是进行同样的操作。
(4)重复以上操作,可以看出这是一个递归定义,通过将左侧部分排好序后,再递归排好右侧部分顺序,左右两部分的数据排好序后,整个数组也就完成了整个数组的排序
平均时间复杂度:O(nlogn) 最坏:O(n^2)
public static void quickSort(int[] keys) { quickSort(keys, 0, keys.length-1); } private static void quickSort(int[] keys, int begin, int end) { if (begin>=0 && begin<keys.length && end>=0 && end<keys.length && begin<end) { int i=begin, j=end; int vot=keys[i]; while (i!=j) { while (i<j && keys[j]>=vot) j--; if (i<j) keys[i++]=keys[j]; while (i<j && keys[i]<=vot) i++; if (i<j) keys[j--]=keys[i]; } keys[i]=vot; quickSort(keys, begin, j-1); quickSort(keys, i+1, end); } }
归并排序:
思想:
将含有n个待排序的数据序列看成n个长度为1的有序子表组成,将其依次两两合并然后再对其两两合.....重复这个过程,直到最后长度为n;
平均时间复杂度:O(nlogn)最坏:O(nlogn)
public void merge(int a[],int s,int m,int t,int []temp){//temp =new int[t-s+1];int i = s,j =m+1,k =0;while(i<m&&j<=t){if(a[i]<a[j]){temp[k] = a[i];k++;i++;}else{temp[k] = a[j];j++;k++;}}while(i<m){temp[k] = a[i];k++;i++;}while(j<=t){temp[k] = a[i];j++;k++;}while(s<=t){a[s++] = temp[k++];}}public void mergeSort(int array[],int l,int r,int []temp){if(l<r){int mid = (l+r)/2;mergeSort(array,l,mid,temp);mergeSort(array,mid+1,r,temp);merge(array,l,mid,r,temp);}}public void mergeSort(int []arr){int []temp = new int[arr.length];mergeSort(arr, 0, arr.length-1, temp);}
桶排序O(n)、基数排序O(dn) ----d实常数
不稳定的排序:
快速排序、希尔排序、堆排序O(nlogn)、选择排序
阅读全文
0 0
- java学习笔记之一些简单排序
- java简单排序学习之插入排序
- (Java学习笔记5.1)简单排序
- 学习JAVA中(一) 一些简单的排序算法
- 学习笔记之快速排序法 --java
- Java学习笔记之数组排序算法
- java学习笔记之对象的排序
- java学习笔记之vector的排序
- java学习笔记之数组排序
- java学习笔记之数组排序
- 一些简单排序Java实现
- java学习之简单知识点的笔记
- [学习笔记]Java排序算法之归并排序
- JAVA学习笔记之选择排序与冒泡排序
- Java算法之简单排序算法笔记记录
- java数据结构学习之旅-简单排序总结
- 算法学习之简单排序
- java学习之排序
- Python 二维数组操作
- C++ 修改文件名
- 回归
- C++ 类 构造函数
- 素数(第三届河南省程序设计大赛)
- java学习笔记之一些简单排序
- spark零基础学习路线指导
- inline 内联函数
- Atom常用插件
- mybatis 关联查询 resultMap 同名冲突
- C
- HDU-3829 Cat VS Dog(最大独立集及对题目的分析)
- 今年暑假不AC(贪心)
- Windows下安装Ubuntu16.04 及 Ubuntu常用软件配置 完全版 ~吐血整理!