simple sorting algorithm
Input:A sequence of n numbers < a1, a2, ... an>
Output: A reordering permutation of the input sequence.( ex. in ascending order)
1.Insertion sort 插入算法
就像我们玩扑克在摸牌一样,每次从牌堆里抽出一张牌都将其插入手牌中适当的位置。可以这样假设,先有手牌1张 a[0], 从牌堆中一次取出 a[1]...a[n-1]. 则要经过n-1次比较。第一次比较1次(手牌只有a[0]),第二次比较2次, T[n] =(1+2+...+n-1) 时间复杂度 θ(n^2);
# include <stdio.h>
# define MAX 10
void main()
{
int arr[MAX];
int n; //元素个数
int i, j;
int key = 0;
//给数组赋值
scanf("%d", &n);
for(i = 0; i<n; i++)
scanf("%d",&arr[i]);
for(j = 1; j<n; j++)
{ //逐一比较除首元的其他元素
key = arr[j];
i = j-1;
while(i>=0 && arr[i]>key)
{
arr[i+1] = arr[i];
i = i-1; //将key前面元素逐一比较,(如果key最小)则直到i = -1时跳出循环
}
arr[i+1] = key;
}
for(i = 0; i<n; i++)
printf("%-4d",arr[i]);
}

2.Selection sort 选择排序
选择排序同样也需要2层循环。第1次:先令数组第一个元素为 最小值a[smallest] = a[0]。 通过逐个比较 a[smallest]与a[i] (1<=i<=n-1). if a[smallest]>a[i] exchange a[smallest]<-->a[i].有n-1次比较。 第2次:令第二个元素 为 最小值a[smallest]= a[1]。 通过逐个比较 a[smallest]与a[i] (2<=i<=n-1). if a[smallest]>a[i] exchange a[smallest]<-->a[i]有n-2次. ...... 第n-1次: a[smallest] = a[n-2] 和 a[n-1]比较 1次; T[n]= ((n-1)+(n-2)+(n-3)+...+1) 时间复杂度 θ(n^2);
# include <iostream>
using namespace std;
const int MAX = 10;
int main()
{
int i, j;
int length; //数组元素的个数
int arr[MAX], temp;
cin>>length;
for(i = 0; i<= length-1; i++)
cin>>arr[i];
int smallest;
for(i = 0; i<= length-2; i++)
{
smallest = i;
for(j = i+1; j<= length-1; j++)
{ //i之后的所有元素都比较一次
if(arr[j]<arr[smallest])
{
temp = arr[smallest];
arr[smallest] = arr[j];
arr[j] = temp;
}
}
}
//输出
for(i = 0; i<= length-1; i++)
cout<<arr[i]<<" ";
return 0;
}

3. Bubble sort 冒泡排序
# include <iostream>
using namespace std;
const int N = 10;
int main()
{
int n;
int arr[N];
cin>>n;
for(int i = 0; i<n; i++)
cin>>arr[i];
int temp;
for(i = 0; i<= n-2; i++)
{
for(int j = n-1; j>= i+1; j--)
{
if(arr[j]<arr[j-1])
{
temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
for(i = 0; i<= n-1; i++)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}
4. Merge sort 归并排序
分治递归的应用。 将2个或多个排好序的数组合并成整体有序列
分解: 将n个元素分成 n/2个子序列,直到n为1;
合并: 将单个元素或子序列递归合并。
T(n) = T[n/2]+ θ(n); O(nlgn);
# include <iostream> # include <cmath> using namespace std; int const N = 10; void merge(int a[N], int p, int q, int r); void merge_sort(int a[N], int p, int r); int main() { int arr[N] = {6,4,5,3,1,2}; merge_sort(arr,1,6); for(int i = 0; i<=5; i++) cout<<arr[i]<<" "; cout<<endl; return 0; } void merge(int a[N], int p, int q, int r) { //将排好的子序列 a[p-1... q-1] 和 a[q... r-1] 合并 int max = 99; //max 必须大于数组(a所指的)的所有元素。 int left_len = q-p+1; int right_len = r-q; int left_arr[N]; int right_arr[N]; for(int i = 0; i<= left_len-1;i++) left_arr[i] = a[p+i-1]; for(i = 0; i<= right_len-1; i++) right_arr[i] = a[q+i]; left_arr[left_len] = max, right_arr[right_len] = max; //sentinel i = 0; int j = 0; for(int k = p-1; k<=r-1; k++) { if(left_arr[i]<=right_arr[j]) { a[k] = left_arr[i]; i++; } else { a[k] = right_arr[j]; j++; } } } void merge_sort(int a[], int p, int r) { int q; if(p<r) { q = floor((r+p)/2); merge_sort(a, p, q); merge_sort(a, q+1, r); merge(a, p, q, r); } }