排序算法——冒泡、选择、插入与希尔排序

本文深入解析了四种经典的排序算法:冒泡排序、选择排序、插入排序及希尔排序(缩小增量排序)。通过详细的步骤分析和C++代码实现,帮助读者理解每种算法的工作原理及其在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、冒泡排序

思路分析:

  1. 依次比较相邻的两个数
  2. 将比较小的数放在前面,比较大的数放在后面
  3. 第一趟比较完后,最小的数放在第一位;那么在第二趟的时候不需要再对第一位数进行比较
  4. 依次类推,每一趟比较次数依次减小

c++代码实现:

#include<iostream>
using namespace std;
 
void show(int arr[], int n)
{  
    for(int j= 0; j<n; j++)
	{  
           cout<<arr[j] <<"  ";  
        }  
    cout<<endl;  
}  
 
void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++)
	{
            for (int j = 0; j < n - i - 1; j++)
	        {
                    if (arr[j] > arr[j + 1])  //对相邻两个数进行比较
			{
                            int temp = arr[j];
                            arr[j] = arr[j + 1];
                            arr[j + 1] = temp;
                        }
                 }
         }
}
 
int main()
{  
    int s[7] = {2568417};  
    cout<<"初始:";  
    show(s,10);  
    BubbleSort(s,10);  
    cout<<"排序后:";  
    show(s,10);  
    system("pause"); 
} 

二、选择排序

思路分析:

  1. 假设第一个元素最小,记为min;遍历序列,将其他元素依次与min比较,每当有元素小于min,就将其与第一位进行位置互换
  2. 第二次遍历的时候就不需要再对第一位进行比较了
  3. 依次类推,每次比较的次数依次减小

c++代码实现:

#include<iostream>
using namespace std;
 
void show(int a[], int n)
{  
    for(int j= 0; j<n; j++)
	{  
        cout<<a[j] <<"  ";  
    }  
    cout<<endl;  
}
 
void selectSort(int a[], int len)
{
 
	int min, temp;
	for(int i = 0; i<len-1;i++)
	{
		min =i;
	    for(int j = i+1; j<len; j++)
		{
		    if(a[j]<a[min]) //将其他数字与第一位进行比较
		    {
		    	temp = a[j];
		        a[j] = a[min];
     		    a[min]=temp;  //交换数值
			}
		 
		
		}

	}
}
 
int main()
{  
    int a[10] = {8,1,5,7,2,12,5,75,10,3};  
    cout<<"初始:";  
    show(a,10);  
    selectSort(a,10);  
    cout<<"排序:";  
    show(a,10);  
    system("pause"); 
} 

三、插入排序

在这里插入图片描述

思路分析:

  1. 将整个序列看作有序序列无序序列
  2. 无非是将无序序列的首元素插入进有序序列,(将插入位置以后的元素进行后移,如果待插入的元素与有序序列中某个元素相等,则将待插入元素插入到相等元素的后面)

c++代码实现:

#include<iostream>
using namespace std;

//插入排序

void InsertionSort(int a[], int size)

{
	int pre,temp;
              
    for(int i = 1; i < size; i++)
	{
        pre = i-1; //无序序列的前一位,此时的pre指向有序序列最后一位 
		temp = a[i];
		while(pre >= 0 && temp< a[pre])  
		//比较无序序列第一位与有序序列最后一位 
		{
			a[pre+1]=a[pre];//如果小于则将整个有序序列从此位置向后移
			pre--; 
		} 
		 a[pre+1]=temp;  //如果大于则直接插入 
    }
}

//输出二维数组,rows是行数
void show(int a[], int size)
{
    for(int i=0;i<size;i++)
    {
    	cout<<a[i]<<" ";
    } 
} 


//主函数 
int main(){
    int a[8] ={1,4,2,7,3,9,8,5};
    InsertionSort(a,8);
    show(a,8);
    
    return 0;
}

四、希尔排序(缩小增量排序)

在这里插入图片描述
思路分析:

  1. 第一步将整个序列分成gap=n/2份,然后对每一份使用插入排序
  2. 第二步,将整个序列分成gap=gap/2份,然后对每一份使用插入排序
  3. 依次类推,最终当gap=1时,我们的排序就排好了

c++代码实现:

#include<iostream>
using namespace std;

//插入排序

void InsertionSort(int a[], int size)
{
	int i , j ,gap;
	for(gap=size/2;gap>0;gap /= 2)  
	//对gap进行递减
	{
		for(i=0;i<gap;i++)
		//将其分成gap组
		{
			for(j=i+gap;j<size;j+=gap)  
			//这里就不是每次加1了,而是每次加gap 
			//下面也每次都是加gap 
			{
				int pre,temp;
				pre=j-gap;
				temp=a[j];
				while(pre>=0 && temp<a[pre])
				{
					a[pre+gap]=a[pre];
					pre-=gap;
				}
				a[pre+gap]=temp;
				
			}
		}
		
	} 

}
void show(int a[], int size)
{
    for(int i=0;i<size;i++)
    {
    	cout<<a[i]<<" ";
    } 
} 
//主函数 
int main(){
    int a[7] ={1,4,7,3,9,8,5};
    InsertionSort(a,7);
    show(a,7);  
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值