Java語言實現六種排序演算法
阿新 • • 發佈:2018-12-05
Java語言實現六種排序演算法
氣泡排序
從左到右依次比較相鄰兩個元素,如果大的在左邊則交換這兩個元素。
如果在依次遍歷中執行過交換操作,則再次遍歷,直到不發生元素交換。
public static int[] sort (int[] num){
int length=num.length;
boolean flag=true;
while(flag==true){
flag=false;
for(int i=0;i<length-1;i++){
if(num[i]>num[i+1]){
num[i]=num[i]+num[i+1]-(num[i+1]=num[i]);
flag=true;
}
}
}
return num;
}
插入排序
從左到右遍歷每個元素,遍歷到的元素作為待定元素。
待定元素與其左邊的元素逐個相比,如果左邊大則交換,如果右邊大則遍歷下一個待定元素。
public static int[] sort(int[] num){
for(int i=1;i<num.length;i++){
for(int j=0;j<i;j++){
if(num[j]>num[i]){
num[i]=num[i]+num[j]-(num[j]=num[i]);
}
}
}
return num;
}
歸併排序
如果被排序陣列長度大於2,將要排序的陣列從中間分為左右兩組,分別遞迴執行歸併排序,然後將排序後的兩組有序陣列進行排序合併。
如果被排序陣列長度不大於2,則直接進行排序。
public static int[] sort(int[] num){
sort(num,0,num.length-1);
return num;
}
public static int[] sort(int[] num, int start,int end){
int mid=(start+end)/2;
if(start<end){
sort(num,start,mid);
sort(num,mid+1,end);
}
compare(num,start,mid,mid+1,end);
return num;
}
public static int[] compare(int[]num,int start1,int end1,int start2,int end2){
int[] temp=new int[end2+1];
for(int i=start1;i<=end2;i++){
temp[i]=num[i];
}
int point=start1;
while(start1<=end1&&start2<=end2){
if(temp[start1]<=temp[start2]){
num[point]=temp[start1];
point++;
start1++;
}else{
num[point]=temp[start2];
point++;
start2++;
}
}
while(start1<=end1){
num[point]=temp[start1];
start1++;
point++;
}
while(start2<=end2){
num[point]=temp[start2];
point++;
start2++;
}
return num;
}
快速排序
假設最左邊元素作為核心元素。
從最右邊遍歷陣列與核心元素相比,遇到比其小的則交換位置並終止遍歷,或者直到遍歷到核心元素終止遍歷。
再從核心元素原位置向右進行遍歷,遇到比其大的則交換位置並終止遍歷,或者直到遍歷到核心元素終止遍歷。
重複上面兩句直到遍歷完整個陣列,此時核心元素的位置已經確定。
對核心元素左邊的陣列遞迴執行快速排序,對核心元素右邊的陣列遞迴執行快速排序。
public static int[] sort(int[] num){
sort(num,0,num.length-1);
return num;
}
public static int[] sort(int[] num,int start,int end){
if(start<end){
int key=find(num,start,end);
sort(num,start,key-1);
sort(num,key+1,end);
}
return num;
}
public static int find(int[] num,int start,int end){
int key=start;
while(start<end){
for(;end>start;end--){
if(num[end]<num[start]){
num[end]=num[end]+num[start]-(num[start]=num[end]);
key=end;
break;
}
}
for(;start<end;start++){
if(num[start]>num[end]){
num[start]=num[start]+num[end]-(num[end]=num[start]);
key=start;
break;
}
}
}
return key;
}
希爾排序
定義陣列長度為偏移量。
如果偏移量比大於等於1則將偏移量除以2。
從偏移量位置向右遍歷陣列,將遍歷到的元素與其左邊相差偏移量個單位的元素進行比較,如果左邊的小則交換後繼續與左邊相差偏移量個單位的元素比較。
遍歷完成後偏移量折半,重複上一句。
public static int[] sort(int[] num){
int mid=num.length;
while(mid/2>0){
mid=mid/2;
for(int i=mid;i<num.length;i++){
int key=i;
while((key-mid)>=0){
if(num[key]<num[key-mid]){
num[key]=num[key]+num[key-mid]-(num[key-mid]=num[key]);
}else{
break;
}
key-=mid;
}
}
}
return num;
}
選擇排序
從左向右遍歷陣列,每個元素與其右邊的所有元素相比,最小的放在所遍歷的位置。
public static int[] sort(int[] num){
for(int i=0;i<num.length;i++){
for(int j=i+1;j<num.length;j++){
if(num[i]>num[j]){
num[i]=num[i]+num[j]-(num[j]=num[i]);
}
}
}
return num;
}