目录
1 冒泡排序(Bubble Sort)
算法思想:在扫描过程中,比较两两相邻记录,如果反序则交换,最终,最大记录就被“沉到”序列的最后一项,第二遍扫描将第二大“沉到”了倒数第二的位置,重复上述操作,直到n-1遍扫描后,整个序列是有序的。
算法实现:
程序说明:两个子函数都可以实现冒泡排序,但是void BubbleSort1(int a[], int n)把大的往后放是从后面进行交换的,void BubbleSort2(int a[], int n)也是把大的往后放,但是从前面交换的,原理一致。
#include<iostream>
using namespace std;
void BubbleSort1(int *a, int n);
void BubbleSort2(int *a, int n);
int main()
{
int i;
int a[7] = { 3, 2, 5, 8, 4, 7, 6 };
BubbleSort2(a, 7); //BubbleSort2(a, 7);
for (i = 0; i < 7; i++)
cout << a[i] << " ";
cout << endl;
system("pause");
return 0;
}
void BubbleSort1(int a[], int n)
{
int i, j, t;
for (i = 1; i<n; i++)
{
for (j = n - 1; j >= 0; j--)
{
if (a[j] < a[j - 1]) //交换
{
t = a[j];
a[j] = a[j - 1];
a[j - 1] = t;
}
}
}
}
void BubbleSort2(int a[], int n)
{
int i, j, t;
for (i = 1; i<n; i++) //可以写为:for(int i=0;i<n;++i)
{
for (j = 0; j <= n - i - 1; j++) //可以写为:for(int j=0;j<n-i-1;++j)
{
if (a[j] > a[j + 1]) //交换
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (int k = 0; k < n; k++)
{
cout << a[k] << " ";
}
cout << endl;
}
}
2 快速排序(Quick Sort)
算法思想:通过一趟排序将待排记录隔成独立的两部分,其中一部分记录的关键字比另一部分的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序。
1)先从数列中取出一个数作为基准数;
2)分区:将基准数大的数全部放到它的右边,小于或者等于它的数全部放在它的左边;
3)再对左右区间重复第二步,直到各分区只剩一个数。
算法实现:
程序说明:(从小到大排序中)先从右到左扫描后从左到右扫描,次序不能变化。以下有两种不同的写法:
#include<iostream>
using namespace std;
void quickSort(int a[],int,int);
int main()
{
int array[]={34,65,12,43,67,5,78,10,3,70},k;
int len=sizeof(array)/sizeof(int);
cout<<"The orginal arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
quickSort(array,0,len-1);
cout<<"The sorted arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
system("pause");
return 0;
}
void quickSort(int s[], int l, int r)
{
if (l< r)
{
int i = l, j = r, x = s[l]; //选取最左边的数作为基准
while (i < j)
{
while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
j--;
if(i < j) //跳出循环,说明找到小于x的数
s[i++] = s[j]; //相当于将j处元素拷贝到i,并且i后移
while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
i++;
if(i < j) //跳出循环,说明找到大于等于x的数
s[j--] = s[i]; //相当于将i处元素拷贝到j,并且j左移
}
s[i] = x; //将基准拷贝到i处
quickSort(s, l, i - 1); // 递归调用 左 因为i是基准,此时i已经确定好在整个序列中的位置
quickSort(s, i + 1, r); // 递归调用 右
}
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;
int partition(int arr[], int left, int right) //找基准数 划分
{
int i = left + 1;
int j = right;
int temp = arr[left];
while (i <= j)
{
while (arr[i] < temp)
{
i++;
}
while (arr[j] > temp)
{
j--;
}
if (i < j)
swap(arr[i++], arr[j--]);
else i++;
}
swap(arr[j], arr[left]);
return j;
}
void quick_sort(int arr[], int left, int right)
{
if (left > right)
return;
int j = partition(arr, left, right);
quick_sort(arr, left, j - 1);
quick_sort(arr, j + 1, right);
}
//打印数组
void PrintArray(int array[], int len)
{
for (int i = 0; i < len; i++)
{
cout << array[i] << " ";
}
cout << endl;
}
int main(void)
{
const int NUM = 7;
int array[NUM] = { 0 };
srand((unsigned int)time(nullptr));
for (int i = 0; i < NUM; i++)
{
array[i] = rand() % 100 + 1;
}
cout << "排序前:" << endl;
PrintArray(array, NUM);
cout << "排序后:" << endl;
quick_sort(array, 0, NUM - 1);
PrintArray(array, NUM);
system("pause");
return 0;
}
//快排 手动设置标志位
#include<iostream>
#include<algorithm>
using namespace std;
int a[100],n;
void quickSort(int l,int r)
{
int m=a[l]; //以中间元素作为关键数据时 int m=(l+r)/2;
int i=l,j=r;
while(i<j)
{ //直到i>j
while(a[i]<m) i++; //从i开始向前搜索(i++),找到第一个大于m的值
while(a[j]>m) j--; //从j开始向前搜索(j--),找到第一个小于m的值
if(i<=j)
{
swap(a[i],a[j]);//交换a[i]和a[j]的值
i++,j--; //同时i++,j--
}
}
if(l<j) quickSort(l,j); //接下来分别对左边段[l,j]和右边段[i,r]利用同样的方法排序
if(i<r) quickSort(i,r);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
quickSort(1,n);
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
3 插入排序(Insertion Sort)
算法思想:在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排记录全部插入为止。
算法实现:
程序说明:第一个程序是简单插入排序,第二个程序包含简单插入排序和折半插入排序。
#include <iostream>
using namespace std;
void insertSort(int* a, int n)
{
int i, j, k;
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--)
if (a[j] < a[i])
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//将比a[