小结(一)
1、选择排序
首先遍历数组,找出数组中的最小的一个元素。其次,让最小元素与第一个元素交换。接着,从剩下的元素中继续重复上述步骤,最终便可得到一个有序序列。
选择排序整体思路较为简单,容易理解。
void SelectSort(int Arr[],int size)
{
for (int i = 0; i < size-1; i++)//遍历数组下标 从0开始
{
int index = i;//index为下标
for (int j = i+1; j < size; j++)
{
if (Arr[index]>Arr[j])
{
index = j;//下标交换
}
}
if (i != index)
{
swap(Arr[i], Arr[index]);//数字交换
}
}
}
2、插入排序
利用插入的方式进行排序。需要说明的是:数组中的第一个元素为天然有序即从第二个元素开始排序。让已排序区域的最大一个元素与无序区域的第一个元素进行比较,若大于则不需要交换。否则就交换位置,此时有序区域有2个元素。重复上述步骤直到成为一个有序数组。需要说明的是,在有序区域也需要进行比较!!!
void InsertSort(int Arr[], int size)
{
int temp = 0;
int j = 0;
for (int i = 1; i < size; i++)//插入排序认为第一个元素天然有序,从第二个元素开始
{
temp = Arr[i];
j = i - 1;//已排序中最大的一个
while (j>=0&&Arr[j]>temp)//当已排序中的最大元素大于数组中的元素的时候
{
Arr[j + 1] = Arr[j];//数字交换
j--;
}
Arr[j + 1] = temp;
}
}
3、希尔排序
其实就是对插入排序的优化,相比于插入排序提升了排序的效率。
首先,定义一个步长即将数组元素合数除以2,如元素个数为10,那么就分为5个组。接着,对5各组进行插入排序。然后,继续分组5/2,分为2个,此时较小的元素就处于前面的位置了,接着对2个组继续插入排序,重复上述步骤便可得到有序数组。
void ShellSort(int Arr[], int size)
{
int step = size / 2;//步长
int temp = 0;//定义一个临时变量
while (step>0)
{
for (int i = step; i < size; i++)//插入排序
{
temp = Arr[i];
int j = i - step;
while (j>=0 && Arr[j]>temp)
{
Arr[j + step] = Arr[j];
j = j - step;
}
Arr[j + step] = temp;
}
Display(Arr, size);
step /= 2;
}
}
4、全部程序
#include "stdafx.h"
#include<iostream>
using namespace std;
void SelectSort(int Arr[], int size);//选择排序
void InsertSort(int Arr[], int size);//插入排序
void ShellSort(int Arr[], int size);//希尔排序
void Display(int Arr[], int size);//显示结果
int _tmain(int argc, _TCHAR* argv[])
{
int Arr[] = { 23, 46,0, 8, 11, 18 };
int size = sizeof(Arr) / sizeof(int);
SelectSort(Arr, size);
InsertSort(Arr,size);
ShellSort(Arr,size);
Display(Arr, size);
return 0;
}
void SelectSort(int Arr[],int size)
{
for (int i = 0; i < size-1; i++)//遍历数组下标 从0开始
{
int index = i;
for (int j = i+1; j < size; j++)
{
if (Arr[index]>Arr[j])
{
index = j;//下标交换
}
}
if (i != index)
{
swap(Arr[i], Arr[index]);//数字交换
}
}
}
void InsertSort(int Arr[], int size)
{
int temp = 0;
int j = 0;
for (int i = 1; i < size; i++)//插入排序认为第一个元素天然有序,从第二个元素开始
{
temp = Arr[i];
j = i - 1;//已排序中最大的一个
while (j>=0&&Arr[j]>temp)//当已排序中的最大元素大于数组中的元素的时候
{
Arr[j + 1] = Arr[j];//数字交换
j--;
}
Arr[j + 1] = temp;
}
}
void ShellSort(int Arr[], int size)
{
int step = size / 2;//步长
int temp = 0;//定义一个临时变量
while (step>0)
{
for (int i = step; i < size; i++)//插入排序
{
temp = Arr[i];
int j = i - step;
while (j>=0 && Arr[j]>temp)
{
Arr[j + step] = Arr[j];
j = j - step;
}
Arr[j + step] = temp;
}
Display(Arr, size);
step /= 2;
}
}
void Display(int Arr[], int size)
{
for (int i = 0; i < size; i++)
{
cout << Arr[i] << "\t";
}
cout << endl;
}
本文介绍了三种基本的排序算法:选择排序、插入排序和希尔排序。选择排序通过每次找到最小元素与首位交换实现排序;插入排序则是将每个元素插入到已排序部分的正确位置;希尔排序则是对插入排序的优化,通过设定步长逐步减少,提高排序效率。这些排序算法是理解数据结构和算法基础的重要部分。
5344

被折叠的 条评论
为什么被折叠?



