一、常用的排序算法及特点
- 快速排序
- 选择排序
- 冒泡排序
- 堆排序
- 归并排序
- 希尔排序
- 桶排序
1、快速排序是不稳定的,最坏时间复杂的O(n^2),平均和最好时间负责度均为O(nlogn)。它的基本思想是分治。
(1)从序列中找出一个pivot,
(2)然后将数组中的元素分别与pivot比较,放在pivot的两侧,分成了连个区域S1,S2。
(3)然后对S1、S2再执行相同的算法即可得到结果。
(4)基本条件:S1,S2的长度为1或者0。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; void Quick_Sort(int a[], int l, int r); int _tmain(int argc, _TCHAR* argv[]) { int a[5] = { 3, 1, 5, 2, 4 }; Quick_Sort(a,0,4); for (int i = 0; i < 5; i++) { cout << a[i] << endl; } return 0; } /* 快速排序,一种时间复杂度为O(NlogN)的排序算法 特点:大数据量速度比较快,能达到O(NlogN)的时间复杂度,但是不稳定,因为枢纽元素的选择,可能会导致算法运行时间的不同 void Quick_Sort(int a[], int l,int r) { } 1、选定枢纽元素,一般取第一个元素,即key =a[l],i=l;j=r; 2、从数组后方向前遍历,即j--,直到找到小于key的元素,将aa[j]保存到a[i] 3、从数组左侧往右遍历,即i++,直到a[i]大于key,将a[i]保存到a[j] 4、一直循环,知道i==j,将key值放入a[i] 5、继续对枢纽元素左侧,右侧分别进行快速排序(分治的思想) */ void Quick_Sort(int a[], int l, int r) { int i = l, j = r; int key = a[i]; if (i > j) return; while (i < j) { while (i < j && a[j] >= key) { j--; } if (i < j) { a[i++] = a[j]; } while (i < j && a[i] <= key) { i++; } if (i < j) { a[j--] = a[i]; } } a[i] = key; Quick_Sort( a, l, i - 1); Quick_Sort( a, i + 1, r); }