排序的分类:
选择排序(直接选择排序,堆排序)
交换排序(冒泡排序,快速排序)
插入排序(直接插入排序,二分法插入排序,Shell排序)
归并排序等
排序有升序排序和降序排序之分,我们现在单讲升序排序。我们主要讲解冒泡,选择,插入排序,当然在开发中因为性能问题,我们都不会自己写排序算法,排序在笔试题中却是常客。
实例:
若有下列int类型数组需要排序:
int[] arr={2,9,6,7,4,1};
1.冒泡排序
这是最简单的排序法,基本思路如下:
对未排序的元素从头到尾依次比较相邻的两个元素的大小关系,若大于则交换位置,经过第一轮选择排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。可以看出若有N个元素,那么只需要进行N-1轮比较,第M轮要进行N-M次比较(若6个元素,要进行6-1轮比较,第一轮比较6-1次,第二轮比较6-2次)。
//数组的冒泡排序
class ArraySortDemo
{
public static void main(String[] args)
{
int[] arr={2,9,6,7,4,1};
printArray[arr];//[2,9,6,7,4,1]
bubbleSort[arr];//排序
printArray[arr];//[1,2,4,6,7,9]
}
//交换值
static void Swap(int[] arr,int index1,int index2) {
int temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
//冒泡排序
static void bubbleSort(int[] arr){
/*第一轮,最大值排在最后
for(int i =1;i<=arr.length-1;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}*/
/*第二轮,第二大值排在倒数第二
for(int i =1;i<=arr.length-2;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}*/
for(int times =1;times<=arr.length-1;times++)
{
for(int i =1;i<=arr.length-times;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}
}
//打印出来
static void printArray(int[] arr) {
if(arr==null) {
System.out.println("null");
return;
}
String ret="[";
for(int index=0;index<arr.length;index++) {
ret+=arr[index];
//如果当前index不是最后一个索引,则拼接“,”
if(index!=arr.length-1) {
ret=ret+",";
}
}
ret=ret+"]";
System.out.println(ret);
}
}
写循环语句时,可以通过几轮执行来找到循环规律,这样能够避免出错。
2.选择排序
基本思路:
选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用相同的方法把剩下的元素逐个比较即可。
可以看出选择排序,第一轮会选出最小值,第二轮会选出第二个小的值,直到最后。第一轮从arr[0]和后面元素比较,第二轮从arr[1]和后面的元素相比较,以此类推。N个数要进行N-1轮。选择排序每一轮只进行一次交换,相当于冒泡排序效率高一些。
class ArraySortDemo
{
public static void main(String[] args)
{
int[] arr={2,9,6,7,4,1};
printArray[arr];//[2,9,6,7,4,1]
selectionSort[arr];//排序
printArray[arr];//[1,2,4,6,7,9]// 前面写过printArray()
}
//选择排序
static void selectionSort(int[] arr){
/*第一轮
for(int i=1;i<=arr.length-1;i++)
{
if(arr[0]>arr[1])
{ swap(arr,0,i);
}
}*/
/*第二轮
for(int i=2;i<=arr.length-1;i++)
{
if(arr[1]>arr[1])
{ swap(arr,1,i);
}
}*/
for(int times=1;times<=arr.length-1;times++)
{
for(int i=times;i<=arr.length-1;i++)
{
if(arr[times-1]>arr[times])
{
swap(arr,times-1,i);//前面写过swap()
}
}
}
}
}