摘要:向后移動(dòng)位簡(jiǎn)單選擇排序基本思想常用于取序列中最大最小的幾個(gè)數(shù)時(shí)。代碼實(shí)現(xiàn)循環(huán)次數(shù)選出最小的值和位置交換位置堆排序基本思想對(duì)簡(jiǎn)單選擇排序的優(yōu)化。
概述
常見(jiàn)的八大排序算法,它們之間的關(guān)系如下:
直接插入排序
希爾排序
簡(jiǎn)單選擇排序
堆排序
冒泡排序
快速排序
歸并排序
基數(shù)排序
直接插入排序 基本思想經(jīng)常碰到這樣一類排序問(wèn)題:把新的數(shù)據(jù)插入到已經(jīng)排好的數(shù)據(jù)列中。
將第一個(gè)數(shù)和第二個(gè)數(shù)排序,然后構(gòu)成一個(gè)有序序列
將第三個(gè)數(shù)插入進(jìn)去,構(gòu)成一個(gè)新的有序序列。
對(duì)第四個(gè)數(shù)、第五個(gè)數(shù)……直到最后一個(gè)數(shù),重復(fù)第二步。
首先設(shè)定插入次數(shù),即循環(huán)次數(shù),for(int i=1;i 設(shè)定插入數(shù)和得到已經(jīng)排好序列的最后一個(gè)數(shù)的位數(shù)。insertNum和j=i-1。 從最后一個(gè)數(shù)開(kāi)始向前循環(huán),如果插入數(shù)小于當(dāng)前數(shù),就將當(dāng)前數(shù)向后移動(dòng)一位。 將當(dāng)前數(shù)放置到空著的位置,即j+1。 對(duì)于直接插入排序問(wèn)題,數(shù)據(jù)量巨大時(shí)。 將數(shù)的個(gè)數(shù)設(shè)為n,取奇數(shù)k=n/2,將下標(biāo)差值為k的書分為一組,構(gòu)成有序序列。 再取k=k/2 ,將下標(biāo)差值為k的書分為一組,構(gòu)成有序序列。 重復(fù)第二步,直到k=1執(zhí)行簡(jiǎn)單插入排序。 首先確定分的組數(shù)。 然后對(duì)組中元素進(jìn)行插入排序。 然后將length/2,重復(fù)1,2步,直到length=0為止。 常用于取序列中最大最小的幾個(gè)數(shù)時(shí)。 (如果每次比較都交換,那么就是交換排序;如果每次比較完一個(gè)循環(huán)再交換,就是簡(jiǎn)單選擇排序。) 遍歷整個(gè)序列,將最小的數(shù)放在最前面。 遍歷剩下的序列,將最小的數(shù)放在最前面。 重復(fù)第二步,直到只剩下一個(gè)數(shù)。 首先確定循環(huán)次數(shù),并且記住當(dāng)前數(shù)字和當(dāng)前位置。 將當(dāng)前位置后面所有的數(shù)與當(dāng)前數(shù)字進(jìn)行對(duì)比,小數(shù)賦值給key,并記住小數(shù)的位置。 比對(duì)完成后,將最小的值與第一個(gè)數(shù)的值交換。 重復(fù)2、3步。 對(duì)簡(jiǎn)單選擇排序的優(yōu)化。 將序列構(gòu)建成大頂堆。 將根節(jié)點(diǎn)與最后一個(gè)節(jié)點(diǎn)交換,然后斷開(kāi)最后一個(gè)節(jié)點(diǎn)。 重復(fù)第一、二步,直到所有節(jié)點(diǎn)斷開(kāi)。 一般不用 將序列中所有元素兩兩比較,將最大的放在最后面。 將剩余序列中所有元素兩兩比較,將最大的放在最后面。 重復(fù)第二步,直到只剩下一個(gè)數(shù)。 設(shè)置循環(huán)次數(shù)。 設(shè)置開(kāi)始比較的位數(shù),和結(jié)束的位數(shù)。 兩兩比較,將最小的放到前面去。 重復(fù)2、3步,直到循環(huán)次數(shù)完畢 要求時(shí)間最快時(shí)。 選擇第一個(gè)數(shù)為p,小于p的數(shù)放在左邊,大于p的數(shù)放在右邊。 遞歸的將p左邊和右邊的數(shù)都按照第一步進(jìn)行,直到不能遞歸。 速度僅次于快排,內(nèi)存少的時(shí)候使用,可以進(jìn)行并行計(jì)算的時(shí)候使用。 選擇相鄰兩個(gè)數(shù)組成一個(gè)有序序列。 選擇相鄰的兩個(gè)有序序列組成一個(gè)有序序列。 重復(fù)第二步,直到全部組成一個(gè)有序序列。 用于大量數(shù),很長(zhǎng)的數(shù)進(jìn)行排序時(shí)。 將所有的數(shù)的個(gè)位數(shù)取出,按照個(gè)位數(shù)進(jìn)行排序,構(gòu)成一個(gè)序列。 將新構(gòu)成的所有的數(shù)的十位數(shù)取出,按照十位數(shù)進(jìn)行排序,構(gòu)成一個(gè)序列。public void insertSort(int[] a){
int length=a.length;//數(shù)組長(zhǎng)度,將這個(gè)提取出來(lái)是為了提高速度。
int insertNum;//要插入的數(shù)
for(int i=1;i
希爾排序
基本思想
public void sheelSort(int[] a){
int d = a.length;
while (d!=0) {
d=d/2;
for (int x = 0; x < d; x++) {//分的組數(shù)
for (int i = x + d; i < a.length; i += d) {//組中的元素,從第二個(gè)數(shù)開(kāi)始
int j = i - d;//j為有序序列最后一位的位數(shù)
int temp = a[i];//要插入的元素
for (; j >= 0 && temp < a[j]; j -= d) {//從后往前遍歷。
a[j + d] = a[j];//向后移動(dòng)d位
}
a[j + d] = temp;
}
}
}
}
簡(jiǎn)單選擇排序
基本思想
public void selectSort(int[] a) {
int length = a.length;
for (int i = 0; i < length; i++) {//循環(huán)次數(shù)
int key = a[i];
int position=i;
for (int j = i + 1; j < length; j++) {//選出最小的值和位置
if (a[j] < key) {
key = a[j];
position = j;
}
}
a[position]=a[i];//交換位置
a[i]=key;
}
}
堆排序
基本思想
public void heapSort(int[] a){
System.out.println("開(kāi)始排序");
int arrayLength=a.length;
//循環(huán)建堆
for(int i=0;i
public void bubbleSort(int[] a){
int length=a.length;
int temp;
for(int i=0;i
快速排序
基本思想
public static void quickSort(int[] numbers, int start, int end) {
if (start < end) {
int base = numbers[start]; // 選定的基準(zhǔn)值(第一個(gè)數(shù)值作為基準(zhǔn)值)
int temp; // 記錄臨時(shí)中間值
int i = start, j = end;
do {
while ((numbers[i] < base) && (i < end))
i++;
while ((numbers[j] > base) && (j > start))
j--;
if (i <= j) {
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
i++;
j--;
}
} while (i <= j);
if (start < j)
quickSort(numbers, start, j);
if (end > i)
quickSort(numbers, i, end);
}
}
歸并排序
基本思想
public static void mergeSort(int[] numbers, int left, int right) {
int t = 1;// 每組元素個(gè)數(shù)
int size = right - left + 1;
while (t < size) {
int s = t;// 本次循環(huán)每組元素個(gè)數(shù)
t = 2 * s;
int i = left;
while (i + (t - 1) < size) {
merge(numbers, i, i + (s - 1), i + (t - 1));
i += t;
}
if (i + (s - 1) < right)
merge(numbers, i, i + (s - 1), right);
}
}
private static void merge(int[] data, int p, int q, int r) {
int[] B = new int[data.length];
int s = p;
int t = q + 1;
int k = p;
while (s <= q && t <= r) {
if (data[s] <= data[t]) {
B[k] = data[s];
s++;
} else {
B[k] = data[t];
t++;
}
k++;
}
if (s == q + 1)
B[k++] = data[t++];
else
B[k++] = data[s++];
for (int i = p; i <= r; i++)
data[i] = B[i];
}
基數(shù)排序
基本思想
public void sort(int[] array) {
//首先確定排序的趟數(shù);
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
int time = 0;
//判斷位數(shù);
while (max > 0) {
max /= 10;
time++;
}
//建立10個(gè)隊(duì)列;
List
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67632.html
摘要:今天,一條就帶大家徹底跨過(guò)排序算法這道坎,保姆級(jí)教程建議收藏。利用遞歸算法,對(duì)分治后的子數(shù)組進(jìn)行排序?;舅枷攵雅判蚴抢枚堰@種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為,它也是不穩(wěn)定排序。 ...
摘要:不斷執(zhí)行這個(gè)操作代碼實(shí)現(xiàn)快速排序用遞歸比較好寫如果不太熟悉遞歸的同學(xué)可到遞歸就這么簡(jiǎn)單。 前言 大概花了一周的時(shí)間把八大基礎(chǔ)排序過(guò)了一遍,這篇博文主要是用來(lái)回顧一下八大基礎(chǔ)排序的要點(diǎn)和一些總結(jié)~ 回顧: 冒泡排序就這么簡(jiǎn)單 選擇排序就這么簡(jiǎn)單 插入排序就這么簡(jiǎn)單 快速排序就這么簡(jiǎn)單 歸并排序就這么簡(jiǎn)單 堆排序就這么簡(jiǎn)單 希爾排序就這么簡(jiǎn)單 基數(shù)排序就這么簡(jiǎn)單 總的來(lái)說(shuō):快速排序是用...
摘要:技術(shù)之類加載機(jī)制掘金類加載機(jī)制是語(yǔ)言的一大亮點(diǎn),使得類可以被動(dòng)態(tài)加載到虛擬機(jī)中。玩轉(zhuǎn)仿探探卡片式滑動(dòng)效果掘金講起本篇博客的歷史起源,估計(jì)有一段歷史了。 Java 技術(shù)之類加載機(jī)制 - Android - 掘金類加載機(jī)制是 Java 語(yǔ)言的一大亮點(diǎn),使得 Java 類可以被動(dòng)態(tài)加載到 Java 虛擬機(jī)中。 這次我們拋開(kāi)術(shù)語(yǔ)和概念,從例子入手,由淺入深地講解 Java 的類加載機(jī)制。 本文...
摘要:前言最近在回顧以前使用寫過(guò)的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用改寫一下,重溫一下。 前言 最近在回顧以前使用C寫過(guò)的數(shù)據(jù)結(jié)構(gòu)和算法的東西,發(fā)現(xiàn)自己的算法和數(shù)據(jù)結(jié)構(gòu)是真的薄弱,現(xiàn)在用Java改寫一下,重溫一下。 只能說(shuō)慢慢積累吧~下面的題目難度都是簡(jiǎn)單的,算法的大佬可直接忽略這篇文章了~入門或者算法薄弱的同學(xué)可參考一下~ 很多與排序相關(guān)的小算法(合并數(shù)組、獲...
閱讀 1977·2021-09-23 11:21
閱讀 1750·2019-08-29 17:27
閱讀 1112·2019-08-29 17:03
閱讀 784·2019-08-29 15:07
閱讀 2001·2019-08-29 11:13
閱讀 2433·2019-08-26 12:14
閱讀 1004·2019-08-26 11:52
閱讀 1779·2019-08-23 17:09