低级排序:
冒泡排序、选择排序、插入排序
高级排序:
1. 冒泡排序
排序思想:从左到右进行扫描,选择最大的数据,放在右边。
代码要点:相邻的数据两两进行比较,如果左边的比右边的大,将俩数进行交换。
冒泡类似于湖底的泡泡逐渐冒到湖面,序列中的最小的值冒到最前面,最下面是最大值。
O(N^2)
//冒泡排序 相邻的两个值相互交换
public void getBubbleSort(int []arr){
if (arr.length<=1) {
return;
}
int temp=0;
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if (arr[j]>arr[j+1]) {
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
2.选择排序
思想:从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的最后。
要点:选择排序选最小的,往左边选。
//选择排序
public void getSelectSort(int [] arr){
if (arr.length<=1) {
return ;
}
int temp=0;
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if (arr[i]>arr[j]) {
//交换
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
3.插入排序
思想:将一个记录插入到已经排好序的有序表中。
//插入排序
public void getInsertSort(int []arr){
if (arr.length<=1) {
return;
}
int in=0,out=0;
for(out=1;out<arr.length;out++){
int temp=arr[out];
in=out;
while(in>0&&arr[in-1]>temp){
arr[in]=arr[in-1];
- -in;
}
arr[in]=temp;
}
}
4.快速排序
速度最快的排序算法。(枢轴、枢纽)
思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分进行排序,最后得到排序结果。(使用递归)选一个枢轴进行划分,然后递归进行选枢轴划分。
用分治法的三个步骤来描述快速排序的过程如下:
划分步骤:通过枢轴元素 x 将序列一分为二, 且左子序列的元素均小于 x,右子
序列的元素均大于 x;
治理步骤:递归的对左、右子序列排序
//快速排序
public void getQuickSort(int []arr, int low, int high){
int position=0;
if (low<high) {
position=Partition(arr, low, high);
getQuickSort(arr, low, position-1);//前半部分使用递归
getQuickSort(arr, position+1, high);//后半部分使用递归
}
}
//将序列划分为两个子序列 并返回枢轴元素的位置
public int Partition(int[] ra, int low, int high){
int position=0;
position=ra[low];//初始时取第一个数
int temp=0;
while(low<high){
while (low<high && ra[high]>=position) {
high--;
}
temp=ra[high];
ra[high]=ra[low];
ra[low]=temp;
while(low<high&& ra[low]<=position){
low++;
}
temp=ra[low];
ra[low]=ra[high];
ra[high]=temp;
}
return low;
}
5.归并排序
思想:不断的两两归并,有序的与有序的进行归并。
归并排序中一个核心的操作是将一个序列中前后两个相邻的子序列合并为一个有序序
列 。
下图为归并算法的理解示意图:
下图是输入一个数组后怎样进行归并排序示意图: