天天看點

十大經典排序算法1. 相關術語介紹2. 排序算法分類以及複雜度3.排序算法詳解

十大經典排序算法

  • 1. 相關術語介紹
  • 2. 排序算法分類以及複雜度
  • 3.排序算法詳解
    • 3.1冒泡排序
    • 3.2 選擇排序
    • 3.3 選擇排序

1. 相關術語介紹

穩定排序:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;

非穩定排序:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;

内排序:所有排序操作都在記憶體中完成;

外排序:由于資料太大,是以把資料放在磁盤中,而排序通過磁盤和記憶體的資料傳輸才能進行;

時間複雜度:排序所耗費的時間;

空間複雜度:排序所耗費的記憶體;

比較類排序:通過比較來決定元素間的相對次序,由于其時間複雜度不能突破O(nlogn),是以也稱為非線性時間比較類排序。

非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運作,是以也稱為線性時間非比較類排序。

2. 排序算法分類以及複雜度

排序算法分類

十大排序算法主要可以分為兩大類:1.比較類排序 2.非比較類排序,下面是排序算法的分類

十大經典排序算法1. 相關術語介紹2. 排序算法分類以及複雜度3.排序算法詳解

不同排序算法的複雜度以及穩定性

十大經典排序算法1. 相關術語介紹2. 排序算法分類以及複雜度3.排序算法詳解

3.排序算法詳解

3.1冒泡排序

下面對資料從小到大排序

思想:每次尋找一組資料中最大的元素,兩兩比較,找到後放到資料的最後一位。n個資料第一次兩兩比較n-1次。

第二次比較n-2次,比較的時候如果前一個元素比第二個元素大則互相交換。

總共兩層循環:第一層代表需對比幾輪;第二層代表需要兩兩對比多少次

以下面的圖舉例

15個數,第一輪兩兩對比49次找出15個數中最大的數50

第二輪兩兩對比48次找到次大數48

以此類推…

那總共需要多少輪呢?

15個數,需要14輪

每輪需要兩兩對比多少次呢?

很明顯,每輪兩兩對比的次數不固定

第一輪兩兩對比14次找到最大數

第二輪需要對比13次,因為不用和最後一個數對比

十大經典排序算法1. 相關術語介紹2. 排序算法分類以及複雜度3.排序算法詳解
十大經典排序算法1. 相關術語介紹2. 排序算法分類以及複雜度3.排序算法詳解

C語言代碼

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int BubbleSort(int arr[],int len)
{
	int temp = 0;
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-1-i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
}
int main()
{
	int arr[] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	int len = sizeof(arr) / sizeof(arr[0]);
	BubbleSort(arr,len);
	
}
           

3.2 選擇排序

選擇排序:每輪都找到一組資料中最小的數依次放在數組前面。

與冒泡排序的不同:冒泡排序在找數的時候,每次比較都需要進行資料交換,而選擇排序是兩兩對比 記錄資料 的索引,找到資料後隻進行一次交換。

以對{ 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 }由小到大排列為例

C語言代碼

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void selectionSort(int arr[], int len)
{
	int temp = 0;
	for (int i = 0; i < len-1; i++)
	{
		int index = i;
		for (int j = i+1; j < len; j++)
		{
			if (arr[j] < arr[index])
			{
				index = j;
			}
		}
		temp = arr[i];
		arr[i] = arr[index];
		arr[index] = temp;
	}
	for (int i = 0; i < len; i++)
	{
		printf("%d  ", arr[i]);
	}
}
int main()
{
	int arr[] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
	int len = sizeof(arr) / sizeof(arr[0]);
	selectionSort(arr, len);
}
           

3.3 選擇排序

繼續閱讀