排序演算法學習

2021-07-25 13:50:15 字數 3756 閱讀 7527

一直都想把排序和搜尋類的演算法總結一下,一直拖著沒寫,主要是太懶了,現在決定還是要再好好學習下這些基本的演算法。畢竟基礎真的是很重要。好了現在開始學習第乙個排序演算法–插入排序

我記得插入排序在我們以前的資料結構教程上是第乙個介紹的^-^

插入排序 聽這個排序名字就是將乙個什麼數要插入到某個地方,不錯,他就是將無序數列中的第乙個數插入到有序數列中,使得這一組資料都成為有序的。

比如這一組無序資料,用插入排序使得有序,首先來看哪乙個數值是無序數列中的第乙個數字,上面這組資料1就是無序數列中的第乙個數字,因為數列中只有乙個數字3,不管怎麼看都是有序的。這樣我們就將1和有序表中的數字進行比較嗎,只要比有序表中和無序第乙個元素就可以嗎,覺得還是比較簡單的

於是乎就開始噼噼的寫**了

public

static

void

insertsort_error();

for (int i = 1; i < a.length; i++)

}for (int i = 0; i < a.length; i++)

}

寫出了上面的這段**,一執行發現 咦 怎麼執行的結果是1,3,4,6,5,8 很明顯是錯誤的,仔細看下上面的**,發現寫成這樣把即將要插入的元素有序表裡面的最後乙個元素進行比較。這裡有乙個很大的問題就是如果有序表中的倒數第二個元素也比待插入的資料要大的話,就出現了上面的情況啦。好了我們既然知道原因啦,那就要修改下上面的**了。

要注意的是我們現在要插入的元素是要插入到有序表中的,不是和有序表中的最後乙個元素比較就可以了。

public

static

void

insertsort() ;

for (int i = 1; i < a.length; i++)

a[j+1]=key;

}for (int i = 0; i < a.length; i++)

這次再執行得到的結果是1,3,4,5,6,8,結果是正確的

這段**就是正確的插入排序,外面的一層迴圈就是一次遍歷無序表中的元素,內層裡面的while迴圈就是將元素正確的插入到有序表中。

上面介紹完了插入排序,再來學習第二個排序演算法–選擇排序,選擇排序的原理就是在一組無序的元素中選擇乙個最大的或則是最小的資料和第一元素進行交換,使之成為有序數列

同樣這組資料,使用選擇排序,首先是在這組數列中找到最小的元素(這裡我們都是用從小到大的順序進行排序)1,把1和數列中第乙個元素的位置進行交換,這樣就和3交換,交換之後剩餘的就是,再將這組元素來一次排序,這個次呢3是最小的元素,它也是在數列中的第乙個,就不用進行交換了,一次類推,當無序數列中的元素為0的時候,這個時候排序就完成了啦

下面就是選擇排序的**實現

// 

public

static

void

selectsort() ;

for (int i = 0; i < a.length; i++)

}//這裡進行判斷當要交換的元素本身就是第乙個的話,那就不用交換了

if(pos != i)

}}

接下來就開始介紹氣泡排序了,氣泡排序的原理是不斷的遍歷數列,比較相鄰的兩個元素,如果這兩個元素排序不正確,就把他們交換過來,直到沒有交換,就說明排序已經完成了

同樣進行一次遍歷,還是按照從小到大來進行排序,一次遍歷之後會出現1,3,4,6,5,8,再進行下一次遍歷,直到整個沒有交換,就說明已經完成排序了

public

static

void

bubblesort();

while(true)

}//如果沒有交換了,說明排序已經完成了

if(flag)

}

下面乙個排序就是快速排序,快速排序的原理就是將一組待排數列,以乙個元素為基準點,分成兩部分,使得一部分的所有資料比另一部分的所有資料都要小,再分別將這兩組資料進行快排,直到數列有序

上面的這組數列,我們以3為基準值,來進行一次快排,比3小的在他的左邊,比3大的在右邊。進行一次快速排序之後

那麼快速排序用**要怎樣實現

我們先定義兩個索引下標,begin,end分別對應著陣列第乙個元素和最後乙個元素,首先以3為基準值,從後往前看如果發現有比基準值3小的數字,就將它與三進行交換,此時的i++;再從i+1的位置從前往後比較,如果發現有比基準值大的數值就將他複製給剛剛j值(注意這個j值是遞減的,下標j值對應的應該是剛剛進行從後往前遍歷時比基準值要小的小標)這樣依次比較,知道i>=j,這一輪的快排就可以將數列分成以3為基準值得兩部分。

下面就是我們的**實現

public

static

void

quicksort(int a,int begin ,int end)

//基準值

int refer = a[begin];

int i = begin;

int j = end;

while(iwhile(a[j] > refer && i < j)

system.out.println(j);

//從後往前遍歷,出現比基準值要小的數則將它和基準值交換

if(i//從前往後遍歷,返現比基準值要大的數,則將它放到從後往前遍歷,比基準值小的數的位置

while(a[i]< refer && i < j)

if(iif(begin < (i-1))

if((j+1)1, end);

}

}

說完上面的快速排序之後,接下來要看得是希爾排序,希爾排序是乙個高效版的插入排序。希爾排序是把記錄按下標的一定增量分組,對每組使用插入排序演算法排序;隨著增量逐漸減少,當增量減至1時,整個檔案恰被分成一組,排序就完成了。

這裡的增量值就是取陣列長度/2,即為4,經過乙個分組排序後,增量值/2,直到增量值為1.

33, 13, 64, 45, 18, 15,56,32,54

下標 0 1 2 3 4 5 6 7 8

第一組 33 18 54

第二組 13 15

第三組 64 56

第四組 45 32

分別對著四組資料進行插入排序,再進行第二輪插入排序的時候這時的增量就為2了

來看下第一次分組排序完成後這些資料

18,13,56,32,33,15,64,45,54

以增量為2再進行分組排序

18, 13, 56, 32, 33, 15,64,45,54

下標 0 1 2 3 4 5 6 7 8

第一組 18 56 33 64 54

第二組 13 32 15 45

下面是排序結果

18,13,33,15,54,32,56,45,64,

以增量為1進行分組排序,就是第乙個介紹的插入排序啦

下面是排序結果

13,15,18,32,33,45,54,56,64

下面通過**來實現下

//希爾排序,將待排資料按照增量分成幾組,在分別對著幾組資料進行插入排序

public

static

void

shellsort();

int d = a.length;

while(true)

a[k + d] = key;}}

if(1 == d)

}

for (int i = 0; i < a.length; i++)

}

排序演算法學習

1.氣泡排序 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 排序演算法練習 從小排序 public ov...

排序演算法學習

快速排序演算法 通過一趟排序將資料分成兩部分 其中一部分的資料要比 另外一部分小或大 利用遞迴進行 直至資料有序 演算法步驟 1.定義兩個指標分別指向低位和高位 2.將陣列第乙個元素作為基數 3.從後往前遍歷 high 直至找到第乙個小於key的值 4.從前往後遍歷 low 直至找到第乙個大於key...

排序演算法學習

include include include include include define n 10000500 long long beg int cnt,n void show time void swap int a,int b 稱這兩個函式為比較函式,函式名即相當於指標,將其寫入排序演算法...