大綱:很早之前就知道冒泡、選擇雇初、插入拢肆,二分查找法卻沒有詳細(xì)的研究過他們之間的區(qū)別,今天就靜下來靖诗,將它們好好總結(jié)一下郭怪,按照自己的理解和想法,將它們的原理寫出來刊橘,加深下自己的印象鄙才。
1:冒泡排序:原理:冒泡顧名思義,就像氣泡從水底冒出一樣促绵,它的排序方式是:研究了一下攒庵,它給人的感覺是像近視眼一樣,它只能看見自己和緊挨著自己的下一個數(shù)字败晴,所以它的排序方式也就是將比較元素和緊挨著自己的元素比較看是否交換位置浓冒,然后持續(xù)這個過程,比較的一直都是緊挨著的兩個元素位衩。下面看代碼吧裆蒸,再代碼里面再詳細(xì)解釋。
package wjwei;
public class bubbleSort {
/**
* @param args
*/
//定義排序的數(shù)組
static float arr[]={3.5f,4.5f,4,2,7,1};
//定義temp用于交換時充當(dāng)中間元素
static float temp=0;
public static void main(String[] args) {
//外層循環(huán)糖驴,拿著數(shù)組中的元素和其它元素逐個比較
for(int i=0;i
/*內(nèi)層循環(huán)僚祷,就是將0元素的值拿著和1元素的比較,0元素值大于1元素就交換0和1的值贮缕,不大于就開始循環(huán)j++比較1元素值和2元素的值辙谜,循環(huán),直到達(dá)到了arr.length(),結(jié)束內(nèi)層循環(huán)感昼,此時就將數(shù)組中最大的數(shù)放在了最高位置装哆。然后開始外層循環(huán)i++,開始第二圈的內(nèi)層循環(huán),比較出除了最大值之外的最大值,這句話的原因是因?yàn)榈谝蝗r候已經(jīng)把最大值得到放在它的正確位置蜕琴,所以以后也不用再比較它了萍桌,這就是i
for(int j=0;j
if(arr[j]>arr[j+1]){
//換位
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int k=0;k
System.out.print(arr[k]+"\t");
}
}
}
總結(jié):冒泡排序就是將未排序的元素之間逐個比較并逐個的交換位置。詳細(xì)介紹和總結(jié)完冒泡排序凌简,下面就是選擇排序了上炎,
詳細(xì)介紹和總結(jié)完冒泡排序唇礁,下面就是選擇排序了
2扎谎、選擇排序:選擇排序是冒泡排序的升級。它和冒泡相比藻茂,交換的次數(shù)減少了凸郑,但是比較的次數(shù)還是一樣的裳食。
原理:選擇實(shí)際就是選出數(shù)組中未排序的最大或者最小值,然后將其放在自己的位置芙沥。下面看代碼:
package wjwei;
public class selectSort {
public static void main(String []args){
int brr[]={4,9,39,13,43,5};
Select select=new Select();
select.sort(brr);
}
}
class Select{
public void sort(int arr[]){
//定義交換變量
int temp=0;
//外層循環(huán)诲祸,比較并交換位置
for(int i=0;i
//定義min用于接收數(shù)組中的最小值
int min=arr[i];
//定義minid接收最小值的小標(biāo)
int minid=i;
//內(nèi)層循環(huán),找出為比較數(shù)組中的最小的下標(biāo)
for(int j=i+1;j
if(arr[i]>arr[j]){
min=arr[j];
minid=j;
}
}
/*交換最小值的位置備注:從這里可以看出和冒泡的區(qū)別憨愉,冒泡是在內(nèi)層循環(huán)的時候進(jìn)行位置的交換烦绳,而選擇排序卿捎,則是先選出最小值配紫,在外層循環(huán)進(jìn)行位置交換,這樣就可與節(jié)省下了內(nèi)層循環(huán)時的交換次數(shù)午阵。*/
temp=arr[i];
arr[i]=arr[minid];
arr[minid]=temp;
}
for(int k=0;k
System.out.print(arr[k]+"\t");
}
}
}
總結(jié):選擇排序相比冒泡效率高了躺孝,減少了交換位置的次數(shù)。
3底桂、插入排序:是將所插入的元素植袍,插入已經(jīng)有一定順序的數(shù)組中。
插入原理:1籽懦、首先要定義一個標(biāo)記的元素于个,好進(jìn)行判斷要往哪里插入;2暮顺、要和標(biāo)記元素進(jìn)行比較厅篓,看插在標(biāo)記元素的哪邊。3捶码、如果是右邊就直接插入羽氮,如果是左邊則需要和標(biāo)記位的左邊的每一位進(jìn)行比較,找尋插入的位置惫恼。
下面看代碼以及詳細(xì)解釋:
package wjwei;
public class charu {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[]={3,1,-4,9,-8,5,-3,7,0,3,5,56,45};
Insert insert=new Insert();
insert.sort(arr);
}
}
class Insert{
public void sort(int arr[]){
//for循環(huán)档押,從下標(biāo)1開始遍歷數(shù)組,進(jìn)行插入
for(int i=1;i
//定義插入的數(shù)據(jù)元素
int charu=arr[i];
//定義標(biāo)記位置,也就是插入的位置
int yuan=i-1;
/*判斷令宿,如果標(biāo)記位置大于等于0并且插入的數(shù)據(jù)元素小于標(biāo)記的元素則進(jìn)入循環(huán)將標(biāo)記數(shù)據(jù)往右移叼耙,然后對標(biāo)記位置進(jìn)行--操作,使要插入的數(shù)據(jù)與標(biāo)記左側(cè)各個數(shù)據(jù)相比粒没,滿足循環(huán)的條件就進(jìn)行右移操作旬蟋,不滿足循環(huán)的條件就跳出循環(huán)得到自己的位置。*/
while(yuan>=0&&charu
//把前面存在的那個數(shù)的數(shù)向后移動一位
arr[yuan+1]=arr[yuan];
//讓yuan向前一位
yuan--;
}
//不滿足比標(biāo)記元素小革娄,也不滿足標(biāo)記位置大于0就將插入的元素放在標(biāo)記位置的右邊
arr[yuan+1]=charu;
}
//輸出最后結(jié)果
for(int i=0;i
System.out.print(arr[i]+"\t");
}
}
}
總結(jié):插入排序倾贰,前期比較次數(shù)較少,相比較冒泡每次都要比較每次都要交換拦惋,和選擇排序的每次都要比較全部的元素相比匆浙,它速度要快。
小結(jié):前面都是簡單排序的方式厕妖。
4,首尼、二分查找:二分查找是很常見而且高效的查找方式,比普通查找速度快的多言秸。普通查找:遍歷數(shù)組和查詢值進(jìn)行比較软能;
二分查找:定義中間值和所查找值進(jìn)行比較,小于中間值就查找中間值左邊的值举畸,大于則相反查排。所以,二分查找要滿足被? ? ? ? ? ? ? ? ? ? ? ? 查的數(shù)組是有序排列的抄沮。下面代碼分別是普通查找跋核,二分查找和遞歸實(shí)現(xiàn)的二分查找。
package boke2;
import java.util.Arrays;
public class Dichotomy {
/**
* 普通查找和二分查找法
*/
public static void main(String[] args) {
int[] num = { 15, 34, 36, 45, 52, 63 };
Arrays.sort(num);
int n = 45;
// int j = findNum(num,n);
// int j = DichotomybyCommon(num, n);
int j = Dichotomybydigui(num, 0, num.length, n);
System.out.println(j);
}
// 普通查找法
public static int findNum(int[] num, int n) {
for (int i = 0; i < num.length; i++) {
if (num[i] == n)
return i;
}
return 0;
}
// 普通二分查找
@SuppressWarnings("unused")
private static int DichotomybyCommon(int[] num, int n) {
int left, right, among;
left = 0;
right = num.length - 1;
while (left <= right) {
among = (left + right) / 2;
if (num[among] == n)
return among;
else if (n < num[among])
right = among - 1;
else
left = among + 1;
}
return -1;
}
// 遞歸二分查找
private static int Dichotomybydigui(int[] num, int left, int right,
int keyNum) {
int among = (left + right) / 2;
if (left <= right) {
if (num[among] == keyNum)
return among;
else if (keyNum < num[among])
//使用遞歸算法自身調(diào)用自身
return Dichotomybydigui(num, left, among - 1, keyNum);
else
return Dichotomybydigui(num, among + 1, right, keyNum);
}
return -1;
}
}