排序方法的核心思想總結

2021-07-22 04:32:59 字數 2457 閱讀 4256

總結一下排序演算法中的核心思想

1.bubblesort

冒泡法的核心是雙重迴圈:

第一層迴圈表明需要輪次的次數,他的變數i只是標記輪換了多少次,與交換沒有直接關係,在乙個陣列中,需要輪次數為a.length-1次,所以i的取值可設定為1—a.length-1。

第二層迴圈的變數表示的為a[j]與a[j+1]的比較與交換,不斷地遞進,而且是相鄰的兩個元素交換,在進行第i輪次,已經有i-1個資料排好序,並且妨礙陣列的末尾,所以,第i輪次,需要j最大為a.length-1-(i-1)-1,即小於a.length-i,**如下:

static void bubble(int a) 

}} }

2.selectedsort

選擇法的核心也是雙重迴圈:

與冒泡法不同,選擇法需要設定乙個最小下標min,首先預設下標i對應整個資料的最小數,將i賦給min,然後利用第二層迴圈,使a[min]依次與min之後的資料比較,如果在某次比較中,發現還有比a[min]小的資料,那麼重新定義min的值,即min=j(把j賦給min),在進行後面的比較。

第一層迴圈是選定初始值i,並將其設定為min的,i不斷遞進,i的大小範圍為0—a.length-2(因為i要與其後面的資料比較,所以,i的最大位置為倒數第二個)。當第二層迴圈結束後,說明已經找到比a[i]還小的值,那麼交換即可。

第二層迴圈是在選定min之後,依次比較min之後的資料,找出min之後的比a[min]小的資料,將其下標j記錄在min中。j的取值範圍是i-a.length-1。**如下:

static void select(int a) 

}temp = a[i];

a[i] = a[min];

a[min] = temp;

} }

3.insertsort

直接插入排序將資料分成兩部分,第一部分是已經排好序的陣列,放在前端,後端序列是待排序的陣列。

第一重迴圈,選擇第乙個待排序的資料a[i],賦值為temp,因資料要從0開始排序,所以i的下標取值為0—a.length-1;

選擇好要排序的資料後,進入第二部分迴圈,這部分迴圈完成的是將temp從後往前依次和排好序的資料比較,如果temp小,則將比較的資料後移一位,直至找到temp需要插入的位置。**如下:

static void insert(int a) 

static void quicksort(int a, int begin, int end)

if(i < j)

}a[i] = temp;

quicksort(a, begin, i-1);// 有i-1,見上if判定

quicksort(a, i+1, end);

} }

6.merge排序

歸併排序的核心是完成兩路陣列的歸併,歸併排序都是基於兩路歸併完成的。歸併排序需要另外乙個和待排序陣列a等長的陣列b,所以他的空間複雜度是o(n)。

歸併排序應該分層,從三個層次理解:第一層是兩路陣列的歸併,需要引數為陣列a,b,begin1,begin2,和每個陣列的長度n,**如下:

static void merge(int a, int b, int begin1, int begin2, int n) 

else

} while(i < begin1+n && i < a.length)

while(j < begin2+n && j < a.length)

}

第二層對a完成一趟的兩路陣列合併,**如下:

static void merge(int a, int b, int k) 

}

7.堆排序

堆排序主要分成兩步,第一步,把堆調成最小堆,第二步,進行堆排序。

調堆的過程是從最底層開始的,也就是說,從parent=a.length/2-1開始,這裡parent必然是最後乙個葉子的父親,先將parent複製到temp中儲存起來,然後判定一下左右子樹的大小,找出最小子樹,然後與parent比較,如果parent更小,說明不需移動,可以直接返回,如果最小子樹更小,那麼需要把子樹複製到parent上,然後將parent和child下移,繼續這個迴圈,直到找到最後的子樹,將temp複製過去即可。

堆排序利用了調堆方法,先選出最小值,與最末尾的數值交換,之後陣列個數減一,進行調堆,**如下:

private static void heapsort(int a) 

for(int j=a.length-1; j>0; j--) }

private static void sift(int a, int parent, int end)

if(temp > a[child])

else break;

} a[parent] = temp;

}

MapReduce核心思想

mapreduce核心程式設計思想,如圖1 1所示。圖1 1 mapreduce核心程式設計思想 1 分布式的運算程式往往需要分成至少 2個階段。2 第乙個階段的 maptask 併發例項,完全並行執行,互不相干。3 第二個階段的 reducetask 併發例項互不相干,但是他們的資料依賴於上乙個階...

Kafka核心思想

kafka是2010年12月份開源的專案,採用scala語言編寫,使用了多種效率優化機制,整體架構比較新穎 push pull 更適合異構集群。設計目標 1 資料在磁碟上的訪問代價為o 1 2 高吞吐率,在普通的伺服器上每秒也能處理幾十萬條訊息 3 分布式架構,能夠對訊息分割槽 4 支援將資料並行的...

Spring核心思想

spring三大核心思想分別是 控制反轉 ioc 依賴注入 di 面向切面程式設計 aop ioc 控制反轉 將元件間的關係從程式內部轉移至外部容器 xml檔案 中進行管理。di 依賴注入 元件間的依賴關係由系統執行期間決定。外部容器將帶有依賴關係的目標物件例項動態注入到系統中的各個元件中。ioc與...