- 1、關於java直接插入算法的問題
- 2、java中排序方法有哪些
- 3、Java 直接插入排序法
- 4、java插入排序算法
- 5、基礎的~java直接插入排序 求大蝦指點~~~= =
/**這是一個利用直接插入排序法寫的一個小程序;
直接插入排序是一個將待排序列中的元素p[i]與一個有序序列中的元素q[j–]比較(從後向前),當p[i] = q[j] (遞增排序)或 p[i] = q[j] (遞減排序)時,q[j+1] = p[i];反之就將q[j]移位到q[j+1]為p[i]的插入預留空間且如果j==0則q[j] = p[i].
*/
public class SISort
{
public static int[] sortAscending(int []with){ //整數遞增排序
int length = with.length; //獲取待排數組的元素個數;
int []temp = new int[length];
temp[0] = with[0]; //定義一個只有一個元素的有序數組
for(int i=1; ilength; i++){
for(int j=i-1; j=0;j–){
if(with[i] = temp[j]){ //如果待排序列中的元素大於等於有有序序列中的元素,則插入
temp[j+1] = with[i];
break;
}
else {
temp[j+1] = temp[j]; //給待插入元素預留空間
if(j == 0)
temp[j] = with[i]; //with[[i]是有序序列中最小的,因此排在開頭
}
}
}
return temp;
}
public static double[] sortAscending(double []with){ //帶小數的遞增排序
int length = with.length; //獲取待排數組的元素個數;
double []temp = new double[length];
temp[0] = with[0]; //定義一個只有一個元素的有序數組
for(int i=1; ilength; i++){
for(int j=i-1; j=0;j–){
if(with[i] = temp[j]){ //如果待排序列中的元素大於等於有有序序列中的元素,則插入
temp[j+1] = with[i];
break;
}
else {
temp[j+1] = temp[j]; //給待插入元素預留空間
if(j == 0)
temp[j] = with[i]; //with[[i]是有序序列中最小的,因此排在開頭
}
}
}
return temp;
}
public static double[] sortDescending(double []with){ //遞減排序
int length = with.length; //獲取待排數組的元素個數;
double []temp = new double[length];
temp[0] = with[0]; //定義一個只有一個元素的有序數組
for(int i=1; ilength; i++){
for(int j=i-1; j=0;j–){
if(with[i] = temp[j]){ //如果待排序列中的元素小於等於有有序序列中的元素,則插入
temp[j+1] = with[i];
break;
}
else {
temp[j+1] = temp[j]; //給待插入元素預留空間
if(j == 0)
temp[j] = with[i]; //with[[i]是有序序列中最大的,因此排在開頭
}
}
}
return temp;
}
public static int[] sortDescending(int []with){ //遞減排序
int length = with.length; //獲取待排數組的元素個數;
int []temp = new int[length];
temp[0] = with[0]; //定義一個只有一個元素的有序數組
for(int i=1; ilength; i++){
for(int j=i-1; j=0;j–){
if(with[i] = temp[j]){ //如果待排序列中的元素小於等於有有序序列中的元素,則插入
temp[j+1] = with[i];
break;
}
else {
temp[j+1] = temp[j]; //給待插入元素預留空間
if(j == 0)
temp[j] = with[i]; //with[[i]是有序序列中最大的,因此排在開頭
}
}
}
return temp;
}
/* public static void main(String[] args)
{
int []test1 = {2,6,5,8,7,9,10,256,248,14}; //測試數組
double []test2 = {1.1,2.0,3,5,6,8.9,99,5};
int []temp1; //中間變量
double []temp2;
temp1 = sortDescending(test1); //測試整數遞減排序
System.out.println(“get a Decreasing sequence “);
for(int i=0; itemp1.length; i++){
System.out.println(temp1[i]);
}
temp1 = sortAscending(test1); //測試整數遞增排序
System.out.println(“get a Increasing sequence”);
for(int i=0; itemp1.length; i++){
System.out.println(temp1[i]);
}
temp2 = sortDescending(test2); //測試帶小數遞減排序
System.out.println(“get a Decreasing sequence “);
for(int i=0; itemp2.length; i++){
System.out.println(temp2[i]);
}
temp2 = sortAscending(test2); //測試帶小數遞增排序
System.out.println(“get a Increasing sequence”);
for(int i=0; itemp2.length; i++){
System.out.println(temp2[i]);
1、直接插入排序:最基本的插入排序,將第i個插入到前i-1個中的適當位置。
2、折半插入排序:因為是已經確定了前部分是有序序列,所以在查找插入位置的時候可以用折半查找的方法進行查找,提高效率。
3、 希爾排序: 又稱縮小增量排序法。把待排序序列分成若干較小的子序列,然後逐個使用直接插入排序法排序,最後再對一個較為有序的序列進行一次排序,主要是為了減少移動的次數,提高效率。原理應該就是從無序到漸漸有序,要比直接從無序到有序移動的次數會少一些。
4、 冒泡排序:反覆掃描待排序序列,在掃描的過程中順次比較相鄰的兩個元素的大小,若逆序就交換位置。第一趟,從第一個數據開始,比較相鄰的兩個數據,(以升序為例)如果大就交換,得到一個最大數據在末尾;然後進行第二趟,只掃描前n-1個元素,得到次大的放在倒數第二位。以此類推,最後得到升序序列。如果在掃描過程中,發現沒有交換,說明已經排好序列,直接終止掃描。所以最多進行n-1趟掃描。
5、快速排序: 思想:冒泡排序一次只能消除一個逆序,為了能一次消除多個逆序,採用快速排序。以一個關鍵字為軸,從左從右依次與其進行對比,然後交換,第一趟結束後,可以把序列分為兩個子序列,然後再分段進行快速排序,達到高效。
此外還有選擇、歸併、分配排序等等及它們的子類排序
比如數組[3,2,1,5]
這段處理就返回[1,2,3,5]
它的處理是從第二位開始依次跟前邊的比,比前邊的小就往前移動。
也就是[3,2,1,5]
[2,3,1,5]
[1,2,3,5]
(int j = i – 1; j = 0 temp array[j]; j–)
i是這次處理的下標,第一次是1,第二次是2,第三次是3,對應上邊原數組裡的2,1,5
處理開始時把下標i對應的值存在temp里,j表示的是i前邊的下標,temp array[j]的時候說明i下標的值比前邊的小,所以把小的值拿到前邊去。
這麼看是很抽象的,自己在本上寫的數組,畫一下處理過程會更有助於你理解。
import java.util.Arrays;
public class Insert {
public static void main(String[] args) {
int[] ary={8,3,7,1,9,4};
selectionSort(ary);
System.out.println(Arrays.toString(ary));
}
public static void selectionSort(int[] ary) {
int i,j,t;
for(i=1;iary.length;i++){
t=ary[i];
for(j=i-1;j=0tary[j];j–){
ary[j+1]=ary[j];
}ary[j+1]=t;
}
}
}
插入算法的原理是當要被插入的數比數組中元素小就放在他的前面,加了一個中間變量t,把數組元素先放那存着。如果成功插入就把插入數據放到對應的數組位置。然後下一個繼續先放在t裏面存着。直到最後一個數
說幾個我認為錯誤的地方吧:
1、你不是double數組嗎? 怎麼用 int 來取值呢? ” int m=n[i];//代碼1″
2、代碼3,4怎麼都是給n[j] 賦值呢? 賦值兩次?
3、”n[j]=n[0];//代碼4″ 這個是什麼意思?
原創文章,作者:HYZPF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/126940.html