幾種排序方法

2021-08-28 19:38:17 字數 3757 閱讀 2437

一、選擇排序

原理:1、依次比較陣列中元素,從而記錄下陣列中最小的元素

2、將最小元素與陣列第乙個元素交換

3、依次比較陣列中剩餘元素,從而記錄下剩餘陣列中最小的元素 與陣列第二個元素交換,以此類推

特點:需要大約(n-1)+(n-2)+....+1 ~ n^2/2次比較和n次交換,演算法的時間效率取決於比較的次數。

**:

#includeusing namespace std;

template void select_sort(t *a, int len)

for (int i = 0; i != len; i++) }

int main()

; select_sort(a, 3);

system("pause");

return 0;

}

結果:

二、插入排序

原理:1、從陣列的第乙個元素出發 不斷的向右移動

2、每走一步把之前的元素排序

特點:插入排序所需要的時間取決於輸入中元素的初始順序。對於乙個很大的且其中的元素已經有序的陣列進行排序要比隨機的陣列快的多。至少要進行n-1次比較和0次交換,最多需要大約n^2/2次比較和交換。平均n^2/4次比較和交換。

}三、氣泡排序原理:

1、從陣列的第乙個元素開始,比較前兩個元素大小,大的替換較後的位置

2、在依次比較二三號位置的數值,直到陣列末尾n為乙個迴圈,這時最大的數移動到陣列末尾,其他順序不變

3、按照上述方法比較前n-1個元素

特點:最簡單基本的的排序方式

**

#includeusing namespace std;

template void bubble_sort(t *a, int len)

}} for (int i = 0; i < len; i++) }

int main()

; insert_sort(a, 3);

system("pause");

return 0;

}

四、桶排序簡單的桶排序:

原理:1、給定一組數a,其中最大的數為max,定義乙個陣列b,長度為max+1

2、將陣列中的數都置零,遍歷給定的a中的元素i, 在對應陣列b索引為i的位置加1

3、最終輸出b中元素值的索引

特點:

**:

#includeusing namespace std;

template void insert_sort(t *a, int len)

for (m = 0; m != len; m++)

for (int i = 0; i < len + 1; i++) }

int main()

; insert_sort(a, 3);

system("pause");

return 0;

}

複雜一點的桶排序   

原理:和簡單的桶排序差不多只不多陣列不在是max+1,而是分成幾個區間

每個桶用乙個鍊錶表示,桶中放著相應的元素

**:摘自

//每乙個節點的結構  

struct node

;

//宣告:

void printbucketsort(node** bucket, int bucket_size);

int f(int x);

void bucketsort(int* a, int size,int bucket_size)

for (int j = 0; j < size; ++j)

//該桶號不為空,那麼插入排序

else

sub_node->next = sub_head->next;

sub_head->next = sub_node;

bucket[num]->key++;

} }

//列印

printbucketsort(bucket, bucket_size);

}

//對映函式

int f(int x)

//列印

void printbucketsort(node** bucket, int bucket_size)

} cout << endl;

}

void test7()

; cout << "桶排序" << endl;

bucketsort(a, 10, 10); //桶資料最大才97,所以需要10個桶

}

五、歸併排序原理:要將乙個陣列排序,先將他分成兩半分別進行排序,然後再把結果歸併起來

解釋見特點:能夠保證將任意長度為n的陣列排序所需時間和nlogn成正比,缺點是所需的空間和nlogn成正比。

**:

#includeusing namespace std;

templatevoid merge(t* a, t* left, int leftcount, int *right, int rightcount)

else

}while (i < leftcount)

while (j < rightcount)

}templatevoid merge_sort(t *a, int n)

int main()

; // creating an array of integers.

int i, numberofelements;

numberofelements = sizeof(a) / sizeof(a[0]);

// calling merge sort to sort the array.

merge_sort(a, numberofelements);

for (i = 0; i < numberofelements; i++)

cout << " " << a[i];

system("pause");

return 0;

}

各演算法複雜度:

幾種排序方法

排序方法 平均最好 最壞輔助空間 穩定性冒泡 o n2 o n o n2 o 1 穩定簡單選擇 o n2 o n2 o n2 o 1 穩定插入 o n2 o n o n2 o 1 穩定希爾 o nlogn o n2 o n1.3 o n2 o 1 不穩定堆排序 o nlogn o nlogn o n...

java幾種排序 方法

1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...

javascript 的幾種排序方法

所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增 或遞減 次序排列起來。其確切定義如下 輸入 n個記錄r1,r2,rn,其相應的關鍵字分別為k1,k2,kn。輸出 ril,ri2,rin,使得ki1 ki2 kin。或ki1 ki2 kin 這裡,我們簡單介紹幾種排序方法,直接插入排序 希兒排序 ...