1. 程式人生 > >陣列的排序演算法有哪些?如何實現?

陣列的排序演算法有哪些?如何實現?

□ 選擇排序法
選擇排序法的基本思路是:將要排序的陣列分成兩部分,一部分是從小到大已經排好序的,一部分是無序的,從無序的部分取出最小的數值,放到已經排好序的部分的最後。選擇排序法的實現程式碼如下:
//選擇排序法
public int[] xuanze(int[] arr) {
int t;
for (int i = 0; i < arr.length; i++) {
int m = i;
for (int j = i + 1; j < arr.length; j++) {
//如果j元素比m元素小,將j賦值給m
if (arr[j] < arr[m]) {
m = j;
}
}
//交換m和i兩個元素的位置
if(i!= m){
t=arr[i];
arr[i]=arr[m];
arr[m]=t;
}
}
return arr;
}
□ 氣泡排序法
氣泡排序法的基本思路是:從陣列開始掃描待排序的元素,在掃描過程中依次對相鄰元素進行比較,將數值大的元素後移。每經過一趟排序後,數值最大的元素將移到末尾,此時記下該元素的位置,下一趟排序只需要比較到此位置為止,直到所有元素都已有序排列。氣泡排序法的實現程式碼如下:
//氣泡排序法
public int[] maopao(int[] arr)
{
int t;
for (int i=0;i<arr.length;i++)
{
//迴圈比較相鄰兩個元素大小
for(int j=0;j<arr.length-i-1;j++)
{
//比較相鄰元素大小,小的前移,大的後移
if (arr[j]>arr[j+1])
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
return arr;
}
□ 插入排序法
插入排序法的基本思路是:將要排序的陣列分成兩部分,每次從後面的陣列部分中取出索引最小的陣列元素,插入到前面陣列部分的適當位置中。通常在開始排序時,將陣列的第一個元素作為一組,後面的所有元素被當成另一組。插入排序法的實現程式碼如下:
//插入排序
public static int[] charu(int[] arr) {
//把第一個元素看做一部分,第二個元素看做另一部分
//從第二部分中依次取元素插入到第一部分中
for (int i = 1; i < arr.length; i++) {
int tmp = arr[i];
int j = i - 1;
//依次和i前面元素比較,尋找合適插入位置
while(tmp < arr[j]){
arr[j+1] = arr[j];
j——;
if(j ==-1){
break;
}
}
//將插入元素插入到合適位置
arr[j+1] = tmp;
}
return arr;
}
□ 快速排序法
快速排序法是當今被認為最好的排序演算法之一,它的基本思路是:將一個大的陣列的排序問題,分解成2個小的陣列的排序,而每個小的陣列的排序又可以繼續分解成更小的2個數組,這樣一直遞迴分解下去,直到陣列的大小最大為2。快速排序法的實現程式碼如下:
//快速排序法
public static int[] kuaisu(int[] arr){
return quicksort(arr,0,arr.length-1);
}
//遞迴分組排序
public static int[] quicksort(int[] arr,int left,int right){
int t;
if(left < right){
int s = arr[left];
int i = left;
int j = right + 1;
while(true){
//向右找大於s的數的索引
while(i+1 < arr.length && arr[++i] < s);
//向左找小於s的數的索引
while(j-1 >-1 && arr[——j] > s);
//如果i>=j,退出迴圈
if(i >= j){
break;
}else{
//交換i和j位置的元素
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
arr[left] = arr[j];
arr[j] = s;
//對左邊進行遞迴
quicksort(arr,left,j-1);
//對右邊進行遞迴
quicksort(arr,j+1,right);
}
return arr;
}
注意:Arrays類中提供了sort()方法並進行了多次過載,可以實現各種型別陣列的排序功能。該方法採取的排序演算法是一個經過調優的快速排序法,使用示例“Arrays.sort(a)”,a 是一個數組變數。