/*分别用快速/冒泡/插入/查找排序数组
* */
# include <iostream>
using namespace std;
//快速排序
int qsort(int* s,int left,int right) //将数组通过一个分界值分为两部分,左侧保存小于分界值,右侧保存大于分界值,左右两侧分别递归
{
int key = s[left];
while (left < right) //首先要保证左侧下标均小于右侧下标
{
while (left < right && s[right] >= key) //如果右侧的数据大于分界值则右侧容量+1,由于右侧从right开始,故用--right
{
--right;
}
if (left < right){
s[left++] = s[right];
}
while (left < right && s[left] <= key){
++left;
}
if (left < right){
s[right--] = s[left];
}
}
s[left] = key;
return left;
}
void Quick_(int* s,int left,int right)
{
int limit;
if(left < right)
{
limit = qsort(s, left, right); //将每次排序的结果作为枢轴递归排序
Quick_(s, left, limit-1); //递归调用排序 由left 到limit-1
Quick_(s, limit+1, right); //递归调用排序 由 limit+1到 right
}
return;
}
void Quick (int* s , int len){ //快速排序需要三个参数,为统一起见,该函数用于求取其他参数
Quick_(s,0,len - 1);
return ;
}
//冒泡排序
void Bubbling(int* s, int len){ //每一个值依次向后比较
int i = 0;
int j = 0;
for (i = 0; i< len; i++){
for (j = 0 ;j< len -1 -i; j++){
if (s[j] > s[j+1])
{
int tmp = s[j];
s[j] = s[j+1];
s[j+1] = tmp;
}
}
}
}
//选择排序
void Select(int* s ,int len)
{
for (int i = 0 ;i < len ;i++)
{
int k = i;//每次保留遍历的未排序第一个元素的下标
for (int j = 0; j< len ;j++)
{
if (s[k] < s[j])
{
k = j; //找到最小元素的下标
}
if (k != i) { //如果这个元素不是未排序的第一个元素,就和它交换
int tmp = s[k];
s[k] = s[i];
s[i] = tmp;
}
}
}
}
//插入排序
void Insert(int* s ,int len) //每次比较两个数值的大小,将较小的放在前边,后边的和较大数比较
{
for (int i = 1; i< len; i++)
{
int t = s[i]; //记录每次比较的第一个数
int j = i - 1;//记录每次比较的前一个数
while( j>=0 && t <s[j]) //两个数作比较
{
s[j+1] = s[j];
j--;
}
s[j+1] = t;
}
}
//将一个数组赋给另一个数组
void Equal (int* s1 , const int* const s2 , int len) //第一个const为底层const,标示指针指向一个常量,顶层const表示该指针是一个常量,equal为关键字,不能做函数名,数组在作为参数传递时会退化为指向首地址的指针,故需传其长度
{
int i;
for ( i = 0; i< len; i++)
{
s1[i] = s2[i];
}
s1[i] = 0;
}
//打印函数
void show (int* s ,int len){
for (int i = 0 ;i< len; i++){
cout << s[i] << " ";
}
cout << endl;
}
int main()
{
int s[10] = {19,7,6,14,2,11,13,5,8,17};
int s1[10] = {0,};
int s2[10] = {0,};
int s3[10] = {0,};
int s4[10] = {0,};
Equal (s1,s,10);
Equal (s2,s,10);
Equal (s3,s,10);
Equal (s4,s,10);
cout <<"原数组:"<< endl;
show(s,10);
cout <<"冒泡排序:"<< endl;
Bubbling(s1,10);
show(s1,10);
cout <<"选择排序:"<< endl;
Select(s2,10);
show(s2,10);
cout <<"插入排序:"<< endl;
Insert(s3,10);
show(s3,10);
cout <<"快速排序:"<< endl;
Quick(s4,10);
show(s4,10);
}