一、内排序
- 插入排序
template<typename E, typename Comp>
void inssort(E A[], int n) { //Insertion Sort
for (int i = 1; i<n; i++)
for (int j = i; (j>0) && (Comp::prior(A[j], A[j - 1])); j--) //prior是bool值,返回true则说明排好序后A[j]应该在A[j-1]之前
swap(A, j, j - 1);
}
//Insertion Sort
for (int i = 1; i<n; i++)
for (int j = i; (j>0) && (Comp::prior(A[j], A[j - 1])); j--) //prior是bool值,返回true则说明排好序后A[j]应该在A[j-1]之前
swap(A, j, j - 1);
}
原始排序:42 │ 20 17 13 28 14 23 15
i=1: 20 42 │ 17 13 28 14 23 15//20和42比之后,和42交换位置,│以前都是排好序的了
i=2: 17 20 42 │ 13 28 14 23 15
i=3: 13 17 20 42 │ 28 14 23 15
i=4: 13 17 20 28 42 │ 14 23 15//28和42比之后,和42交换位置,然后和20比之后不用交换,结束
i=7: 13 14 15 17 20 23 28 42 │
总结:相当于左边是一个盒子,按顺序从右边取数据,然后插入该数据在左边盒子中的适当位置。
2. 冒泡排序
template<typename E, typename Comp>
void bubsort(E A[], int n) { //Bubble Sort
for (int i = 0; i<n-1; i++)//Bubble up i'th record
for (int j = n-1; j>i; j--)
if(Comp::prior(A[j], A[j - 1]))//prior是bool值,返回true则说明排好序后A[j]应该在A[j-1]之前
swap(A, j, j - 1);
}
//Bubble Sort
for (int i = 0; i<n-1; i++)//Bubble up i'th record
for (int j = n-1; j>i; j--)
if(Comp::prior(A[j], A[j - 1]))//prior是bool值,返回true则说明排好序后A[j]应该在A[j-1]之前
swap(A, j, j - 1);
}
原始排序:42 20 17 13 28 14 23 15
i=0: j=7 42 20 17 13 28 14 15 23//15比23小,所以交换
j=6 42 20 17 13 28 14 15 23//15比14大,所以不用交换
j=5 42 20 17 13 14 28 15 23//14比28小,所以交换
j=4 42 20 17 13 14 28 15 23//14比13大,所以不用交换
j=3 42 20 13 17 14 28 15 23//13比17小,所以交换
j=2 42 13 20 17 14 28 15 23//13比20小,所以交换
j=1 13 │ 42 20 17 14 28 15 23//13比42小,所以交换
i=1:j=7 13 │ 42 20 17 14 28 15 23 //23比15大,所以不交换
j=6 13 │ 42 20 17 14 15<