自己刚刚开始学习排序算法的时候,在网上总是东找西找,总是不那么全面,现在把自己在学习过程中将冒泡排序和快速排序的最基本的算法和性能上的改进的代码全部贴出来,供大家一块学习。
//交换
public static void Swap(int[]arrays,int m,int n)
{
int temp=arrays[m];
arrays[m]=arrays[n];
arrays[n]=temp;
}
public static void Print(int[] arrays)
{
for (int i=0;i<arrays.length;i++)
{
System.out.print(arrays[i]+" ");
}
System.out.println();
}
//冒泡排序
public static void BubbleSort(int[] arrays)
{//最直接的一种表示方法,但是效率低,时间复杂度高
for (int i=0;i<arrays.length-1;i++)
{
for (int j=i+1;j<arrays.length;j++)
{
if (arrays[i]>arrays[j])
{
Swap(arrays,i,j);
}
}
}
Print(arrays);
}
//对于冒泡排序的改进写法
public static void BubbleSortGood(int[] arrays)
{
boolean falg=true;//用来做标记,可以减少不必要的操作
for (int i=0;i<arrays.length&&falg;i++)
{
falg=false;//初始化
for (int j=arrays.length-2;j>=i;j--)
{
if (arrays[j]>arrays[j+1])
{//如果前者比后者的数大,就交换值
Swap(arrays,j,j+1);
falg=true;//若有数据已经交换过了就不需要再进行交换比较了
}
}
}
Print(arrays);
}
//快速排序,冒泡排序的改进,利用分支的思想
public static void Quick(int[] array)
{
// QuickSort(array,0,array.length-1);
QuickSortNew(array,0,array.length-1);
Print(array);
}
public static void QuickSort(int[] arrays,int low,int high)
{
int privot;
if (low<high)
{
privot=Paration(arrays,low,high);
//递归实现
QuickSort(arrays,low,privot-1);//对低表位进行递归
QuickSort(arrays,privot+1,high);//对高表位进行递归
}
}
public static int Paration(int[] arrays,int low,int high)
{
//找到枢纽位置
//将数组中的第一个数放到数组中合适的位置里去,保证前面的数都不大于他本身,后面的数都不小于他本身
int privoty=arrays[low];
while (low<high)
{//根据数值大小寻找其正确的位置
while (low<high&&privoty<arrays[high])
high--;
Swap(arrays,low,high);
while (low<high&&arrays[low]<=privoty)
low++;
Swap(arrays,low,high);
}
return low;
}
/**
* 快速排序代码存在的瓶颈:对于需要找的枢纽的数我们是最小或最大的话对于整个的性能影响十分大
* 因此可以利用三数取其中来解决,防止最左边或最右边的数为最大值或最小值
* 为了避免不必要的交换操作,直接用替换操作来替代
* 递归操作影响效率,因此实施尾递归优化
*/
public static int PartionNew(int[] arrays,int low,int high)
{
//三数取中法
int middle=low+(high-low)/2;
//保证第一个数不是最大或者最小的数
if (arrays[low]>arrays[high])
Swap(arrays,low,high);
if (arrays[middle]>arrays[high])
Swap(arrays,middle,high);
if (arrays[low]<arrays[middle])
Swap(arrays,low,middle);
//作为枢纽值
int prioety=arrays[low];
int temp=prioety;
while (low<high)
{
while (low<high&&arrays[high]>=prioety)
high--;
arrays[low]=arrays[high];//高位发现小的数
while (low<high&&arrays[low]<=prioety)
low++;
arrays[high]=arrays[low];//低位发现大的数
}
arrays[low]=temp;//将枢纽位的数值放到合适的位置
return low;
}
public static void QuickSortNew(int[] arrays,int low,int high)
{
int privot;
while (low<high)
{
privot=PartionNew(arrays,low,high);
QuickSortNew(arrays,low,privot-1);
low=privot+1;//尾递归对代码进行优化
}
}