一、冒泡排序
思路分析:
- 依次比较相邻的两个数
- 将比较小的数放在前面,比较大的数放在后面
- 第一趟比较完后,最小的数放在第一位;那么在第二趟的时候不需要再对第一位数进行比较
- 依次类推,每一趟比较次数依次减小
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] = {2,5 ,6,8,4,1,7};
cout<<"初始:";
show(s,10);
BubbleSort(s,10);
cout<<"排序后:";
show(s,10);
system("pause");
}
二、选择排序
思路分析:
- 假设第一个元素最小,记为min;遍历序列,将其他元素依次与min比较,每当有元素小于min,就将其与第一位进行位置互换
- 第二次遍历的时候就不需要再对第一位进行比较了
- 依次类推,每次比较的次数依次减小
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");
}
三、插入排序
思路分析:
- 将整个序列看作
有序序列
和无序序列
- 无非是将无序序列的首元素插入进有序序列,(将插入位置以后的元素进行后移,如果待插入的元素与有序序列中某个元素相等,则将待插入元素插入到相等元素的后面)
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;
}
四、希尔排序(缩小增量排序)
思路分析:
- 第一步将整个序列分成gap=n/2份,然后对每一份使用插入排序
- 第二步,将整个序列分成gap=gap/2份,然后对每一份使用插入排序
- 依次类推,最终当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;
}