8種金典排序演算法

2021-08-19 20:06:25 字數 4251 閱讀 1368

氣泡排序是許多人最早接觸的排序演算法,由於邏輯簡單,所以大量的出現在計算機基礎課本上,作為一種最基本的排序演算法被大家所熟知。

無序陣列:  254

7168

3 遍歷1次後: 245

1673

8遍歷2次後: 241

5637

8...

遍歷7次後: 123

4567

8

void bubblesore(int *array, int n)}}

}

void bubblesore(int *array, int n) //優化

}i--;

}

}

如果讓乙個初學者寫乙個排序演算法,很有可能寫出的就是選擇排序(反正我當時就是 ^.^),因為選擇排序甚至比冒泡更容易理解。

無序陣列:  254

7168

3 遍歷1次後: 154

7268

3 遍歷2次後: 124

7568

3...

遍歷7次後: 123

4567

8

void selectsort(int *array, int n)

temp = array[min];

array[min] = array[i];

array[i] = temp;

}}#endif

打牌時(以挖坑為例)我們一張張的摸牌,將摸到的牌插入手牌的」順子」裡,湊成更長的順子,這就是插入排序的含義。

無序陣列:  2 | 547

1683

遍歷1次後: 2

5 | 471

683 遍歷2次後: 2

45 | 716

83 遍歷3次後: 245

7 | 168

3...

array[j+1] = temp;}}

}

我真的很敬佩設計出這個演算法的大神,連起名字都這麼霸氣——quick sort。為什麼這麼自信的叫快速排序?因為已經被數學家證明出 在交換類排序演算法中,快排是是速度最快的! 

快排是c.r.a.hoare於2023年提出的一種劃分交換區的排序。它採用一種很重要的」分治法(divide-and-conquermethod)」的思想。快排是一種很有實用價值的排序方法,很多it公司在面試演算法時幾乎都會去問,所以快排是一定要掌握的。

陣列下標: 0  1  2  3  4  5  6  7

無序數列: 4 2 5 7 1 6 8 3

陣列下標: 0  1  2  3  4  5  6  7

無序數列: 3 2 5 7 1 6 8 5

陣列下標: 0  1  2  3  4  5  6  7

無序數列: 3 2 1 4 7 6 8 5

void quicksort(int *array, int l, int r)

if(i < j)

while(i < j && array[i] <= x)

if(i < j)

}array[i] = x;

quicksort(array, l, i - 1);

quicksort(array, i + 1, r);

}}

歸併排序是建立在歸併操作上的一種優秀的演算法,也是採用分治思想的典型例子。 

我們知道將兩個有序數列進行合併,是很快的,時間複雜度只有-o(n)。而歸併就是採用這種操作,首先將有序數列一分二,二分四……直到每個區都只有乙個資料,可以看做有序序列。然後進行合併,每次合併都是有序序列在合併,所以效率比較高。

無序陣列:  254

7168

3 第一步拆分:254

7| 1 6 8 3

第二步拆分:2

5| 4 7 | 1 6 | 8 3

第三步拆分:2

| 5 | 4 | 7 | 1 | 6 | 8 | 3

第一步合併:2

5| 4 7 | 1 6 | 3 8

第二步合併:245

7| 1 3 6 8

第三步合併:123

4567

void mergesort(int *array, int n)

void mergesort(int *array, int first, int last, int *temp)

}void mergearray(int *array, int first, int

mid, int last, int *temp)

else

}while(i <= m)

while(j <= n)

memcpy(array + first, temp, sizeof(int) * k);

}

希爾排序的實質就是分組插入排序,該方法又稱為縮小增量排序,因dj.shell與2023年提出而得名。

無序陣列:      254

7168

3 第一次gap=8/2

2a 1a

5b 6b

4c8c7d3

d

一次增量:      154

3268

7 a b c

d a b c

d

一次增量:      154

3268

7第二次gap=4/2 :1a4

a2a8

a5b 3b 6b 7b

二次增量:      1 3 2 5 4 6 8 7
三次增量:      1 2 3 4 5 6 7 8
void shellsort(int *array, int n)

} }}

}

void shellsort(int *array, int n)

array[k+gap] = temp;

} }}

}

如果有這樣的數列,其中元素種類並不多,只是元素個數多,請選擇->計數排序。 

比如一億個1~100的整型資料,它出現的資料只有100種可能。這個時候計數排序非常的快(親測,快排需要19秒,基數排序只需要不到1秒!)。

void count_sort(int *array, int

length, int

min, int

max)

for(i = 0, j = 0; i < c_size;)else

}free(count);

}

void minheapfixup(int a, int i)

a[i] = temp;

}

void minheapfixup(int a, int i)

void minheapaddnumber(int a, int n, int nnum)

// 從i節點開始調整,n為節點總數 從0開始計算 i節點的子節點為 2*i+1, 2*i+2

void minheapfixdown(int a, int i, int n)

a[i] = temp;

}

void minheapdeletenumber(int a, int n)

//建立最小堆

void makeminheap(int a, int n)

// 堆排序 最小堆 –> 降序排序

void minheapsorttodescendarray(int a, int n)

}

8種排序演算法

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說...

8種排序演算法

1.選擇排序 兩層迴圈巢狀,0到n 1選出最小的,與第0個交換,縮小集合為1到n 1,選出最小的,與第乙個交換 時間複雜度 o n2 空間複雜度 因為中間只增加了兩個新變數,儲存最小值和下標,所以空間複雜度為o 1 當陣列為已排序狀態時,仍需要n次比較,最好的情況仍需要o n2 public sta...

8種排序演算法

public class sortcode a j 1 insertnum 找到位置,插入當前元素 system.out.println 直接插入排序後的陣列為 arrays.tostring a 2.希爾排序 針對直接插入排序的下效率問題,有人對次進行了改進與公升級,這就是現在的希爾排序。希爾排序...