开始先介绍几种简单但是时间复杂度较高的算法选择、冒泡、插入排序,之后是复杂度较低的快速排序。
1、选择排序
一般策略:扫描整个表,找出最小值,将这个值与表中第一个位置的值相交换;继续扫描余下的表(除去第一个元素之外的所有值),找出最小值,将这个值与表中第二个位置的值相交换……直到最后完成排序。
复杂度:n²
代码实现:
public int [] selectSort(int arr[]){
for(int i=0;iint minIndex=findMinIndex(arr,i);
swap(arr,i,minIndex);
}
return arr;
}
2、冒泡排序
一般策略:扫描整个表,比较相邻的元素,如果他们的相互次序不正确,就交换他们。执行一次冒泡操作之后将最大值“冒泡”到表格的最后位置,这也是它在有序表中最终的位置。然后再次扫描表格,将第二个最大值冒泡到最终位置……知道最终排序完成。
复杂度:n²
代码实现:
public int [] bubbleSort(int []arr){
for(int i=arr.length-1;i>0;i--){
for(int j=0;jif(arr[j]>arr[j+1])
swap(arr,j,j+1);
else
continue;
}
}
return arr;
}
3、插入排序
一般策略:
反复将一个个的具体的值插入到表的已有序的子表中,从而完成一组值的排序。(对表中前边两个元素进行排序,如果必要进行交换,然后将第3个值插入到前两个有序子段表的合适位置,之后第4个……都一样插入,直到排序完成(类比玩扑克牌一张张摸牌))
复杂度:n²
代码实现:
public int[] insertSort(int arr[]){// implemented by the linkedlist
int []result =new int[arr.length];
LinkedList list = new LinkedList();
list.add(arr[0]);
for(int i=1;iint j=0;
while(j<list.size())
{
if(arr[i]<(int)list.get(j)){
list.add(j, arr[i]);
break;
}
else
j++;
}
list.add(arr[i]);
}
for(int s=0;sint)list.get(s);
}
return result;
}
其中有关Linkedlist的有关方法详见JavaAPI下载JavaAPI点击此处
4、快速排序
一般策略:先选择表格中的一个元素为划分元素。接下来,对表进行划分,小于划分元素的值放在划分元素左边,大于划分元素的值放在划分元素右边。然后递归对左右两个分段进行排序。
有关递归点击此处
平均复杂度:n ㏒ n ,最坏情况复杂度:n²
代码实现:
关键在于parttition方法的处理
public void quickSort(int arr[],int p,int r){
if(pint q=parttition(arr,p,r);
quickSort(arr,p,q-1);
quickSort(arr,q+1,r);
}
}
//返回数组arr中从p到r位置的中间元素的索引,并且进行小于移左边,大于移右边操作。
public int parttition(int arr[],int p,int r){
int x=arr[r];
int i=p-1;
for(int j=p;jif(arr[j]<=x){
i++;
swap(arr,i,j);
}
}
swap(arr,i+1,r);
return i+1;
}
整体代码:
import java.util.*;
public class Sort {
public int [] selectSort(int arr[]){
for(int i=0;iint minIndex=findMinIndex(arr,i);
swap(arr,i,minIndex);
}
return arr;
}
public int [] bubbleSort(int []arr){
for(int i=arr.length-1;i>0;i--){
for(int j=0;jif(arr[j]>arr[j+1])
swap(arr,j,j+1);
else
continue;
}
}
return arr;
}
public int[] insertSort(int arr[]){// implemented by the linkedlist
int []result =new int[arr.length];
LinkedList list = new LinkedList();
list.add(arr[0]);
for(int i=1;iint j=0;
while(jif(arr[i]<(int)list.get(j)){
list.add(j, arr[i]);
break;
}
else
j++;
}
list.add(arr[i]);
}
for(int s=0;sint)list.get(s);
}
return result;
}
public void quickSort(int arr[],int p,int r){
if(pint q=parttition(arr,p,r);
quickSort(arr,p,q-1);
quickSort(arr,q+1,r);
}
}
public int parttition(int arr[],int p,int r){
int x=arr[r];
int i=p-1;
for(int j=p;jif(arr[j]<=x){
i++;
swap(arr,i,j);
}
}
swap(arr,i+1,r);
return i+1;
}
//*******************************************************************************
public int findMinIndex (int arr[],int start)//找到最小值的索引
{
int min=arr[start];
int result=start;
int i=start;
while(iif(arr[i]<=min){
min=arr[i];
result=i;
}
i++;
}
return result;
}
// *************************************************************************
public void swap(int arr[],int x,int y)//交换数组arr中索引为x和y的两个元素
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
public void printArr(int []arr){
for(int i=0;iout.print(arr[i]+" ");
}
}
public static void main(String []args){
int arr[]={1,3,5,7,9,2,4,6,8};
int result[]=new int[arr.length];
Sort s=new Sort();
s.quickSort(arr, 0, arr.length-1);
s.printArr(arr);
}
}
还有其他排序算法,比如归并排序、堆排序,以后再共同探讨。