//#include <stdio.h> // c 库
#include <stdlib.h> //maclloc 库
#include <iostream> // c++ 库
// 有本句 ,下面cout 前面可以没有 std::
using namespace std;
typedef int ElemType; //元素数据类型 int
void Traver(ElemType B[], int len)
{
cout << "\n------------\n";
for (int i = 1; i <= len; i++) {
cout << B[i] << " ";
}
cout << "\n------------\n";
}
void swap(ElemType& a, ElemType& b) {
ElemType temp;
temp = a;
a = b;
b = temp;
}
//插入排序
//i从1开始,至N-1(其后仅剩一个),拿着第i个和其后的每一个比,
// 找到最小的元素位置,第i个和最小的交换后,第i个排列完成,因i从1是开始因此前面的都已排列完成。
void SelSort(ElemType B[], int N) {
ElemType MinPos;
int i, j;
for (i = 1; i <= N; i++) {
MinPos = i;
for (j = i + 1; j <= N; j++)
if (B[MinPos] > B[j])
MinPos = j;
if (i != MinPos)
swap(B[i], B[MinPos]);
}
}
// 划分两部分,找枢纽位置,搬运数据
//划分成以 pivot 为枢纽的两部分,左大于枢纽,左小于枢纽
//low high 分别指待排序的元素起始下标和结束下标。 假设以B[low]值为枢纽,将B[low]搬运到枢纽
//当high指向元素满足大于枢纽时,移动high指针,直到B[high]小于枢纽,将值搬运到B[low]
//当low指向元素满足小于枢纽时,移动low指针,直到B[low]大于枢纽,将值搬运到B[high]
// 继续搬运,直到low==high
//当high指向元素满足大于枢纽时,移动high指针,直到B[high]小于枢纽,将值搬运到B[low]
//当low指向元素满足小于枢纽时,移动low指针,直到B[low]大于枢纽,将值搬运到B[high]
//结束循环,将枢纽的值搬到枢纽应呆的地方
int Partition(ElemType B[], int low, int high) {
ElemType pivot = B[low];
while (low < high) {
while (low < high && B[high] >= pivot)
--high;
B[low] = B[high];
while (low < high && B[low] <= pivot)
++low;
B[high] = B[low];
}
B[low] = pivot;
return low;
}
//快速排序递归算法
//第一层执行时,(一般)换分为两大部分
//对左部分进行划分,对右部分进行划分。 然后先执行左划分进入第二层循环(第一层里循环的右划分未开始执行,左边全部递归完成),第二层仍然先执行其左划分 …………
//直到某一层的左边执行完,开始进行那一层的右(从本层povit+1起,high乃其上一层的枢纽位置-1),右可能又需要递归并左划分有划分。每层第右执行完,递归返回上一层。
void QuickSort(ElemType B[], int low, int high) {
if (low < high) {
int povit = Partition(B, low, high);
QuickSort(B, low, povit - 1);
QuickSort(B, povit + 1, high);
}
}
//递归法求累加和
//归并、快速等排序使用了递归 ,再熟悉下递归
int Sum(int N) {
int sum;
if (N == 1)
return 1;
else
sum = Sum(N - 1) + N;
}
void main()
{
int B[] = { 0,50,40,30,20,10,1,2 };
//Traver(B, 3);
//选择排序
//SelSort(B, 7);
//快速排序
QuickSort(B, 1, 7);
Traver(B, 7);
//计算前N项和
int N = 100;
int sum = Sum(N);
cout << endl << "Sum(" << N << ") = " << sum;
}