四个基本算法

本篇文章重点描述了C++语言的四种排序算法,基本的思想如下:

1.插入排序
说明:将第2个元素到最后一个元素分别插入到前面已经排好的序列中
初始值: 5,4,3,2,1
loop1: 4,5,3,2,1(4插入到5的前面)
loop2: 3,4,5,2,1(3插入到4的前面)
loop3: 2,3,4,5,1(2插入到3的前面)
loop4: 1,2,3,4,5(1插入到2的前面)

void insertSort(int *arr,int n){
int i,j,value;
for(i = 1; i < n; i++){
    value=arr[i];
    j = i-1;
    while(j>=0&&arr[j]>value){
        arr[j+1] = arr[j];
        j--;
    }
    arr[j+1] = value;
    }
}

2.选择排序
说明:在未排序子序列中选出最小的和未排序的第一个元素交换,从而使已经排序的子序列增长,直到最后排序完成
初始值:6,5,4,2,1
loop1:1,5,4,2,6(最小的是1,和6交换)
loop2:1,2,4,5,6(最小的是2,和5交换)
loop3:1,2,4,5,6(最小的是2,不用交换)
loop4:1,2,4,5,6(最小的是2,不用交换)

void selectSort(int *arr, int n){
  int i,min,tmp,j;
  for(i = 0; i < n-1; i++){
        min = i;
    for(j = i+1; j < n; j++){
        if(arr[j]<arr[min]){
            min = j;
        }
    }
    tmp = arr[i];
    arr[i] = arr[min];
    arr[min] = tmp;
  }
}

3.冒泡排序
说明:在未排序的子序列中找到最大的数放到未排序的序列的最右边,从而使已排序的子序列增长,直到全部排序完成。
初始:2,1,4,5,3
loop1:1,2,4,3,5
loop2:1,2,3,4,5
loop3:1,2,3,4,5
loop4:1,2,3,4,5

void bubbleSort(int *arr,int n){
   int i,j,tmp;
   for(i = 0; i < n-1; i++){
    for(j = 0; j < n-1-i; j++){
        if(arr[j+1]<arr[j]){
            tmp = arr[j+1];
            arr[j+1] = arr[j];
            arr[j] = tmp;
        }
    }
   }
}

4.快速排序
说明:先把arr[low]提出赋值到t,然后从右边开始找high–,找到第1个比t小的,就交换到low的位置,然后low++,找到第一个比t大的,就交换到high的位置,然后再high–,直到low指针和high指针相遇,完成一次排序。
原始:3,2,1,4,5
low=0,high=4;
arr[low]=3,先和arr[high]=5比较,因为5>3所以high–,直到找到1<3,然后arr[low]=1,此时变化指针的流动方向,low++等到low==2时候和high相遇,结束一次循环,结果为:1,2,3,4,5

int partition(int *arr, int low, int high){
int t = arr[low];
 while(low<high){
    while(low<high&&arr[high]>=t)
        high--;
    arr[low]=arr[high];
    while(low<high&&arr[low]<=t)
        low++;
    arr[high]=arr[low];
 }
 arr[low]=t;
 return low;

}

void quickSort(int *arr, int low,int high){
if(low>=high)
    return ;
int p = partition(arr,low,high);
quickSort(arr,low,p-1);
quickSort(arr,p+1,high);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值