用快速/冒泡/插入/查找排序数组.cpp

/*分别用快速/冒泡/插入/查找排序数组
 * */

# 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);
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值