一、选择排序
基本思想:
设 A[1..n]为包含n个元素的数组。
首先,我们找到数组中的最小元素,将它存在A[1]。
接着,我们从剩下的n-1个元素中找到最小的元素,将它存在 A[2]。
重复以上过程,直到整个数组中第二大的元素存在A[n-1],则算法停止。
用动图来表示以下过程:
稳定性:不稳定。
时间复杂度:O(n2)
适用于元素个数较少的排序。
伪代码如下:
input:包含n个元素的数组A[1...n]
output:从小到大排序的数组A[1...n]
1、for i <- 1 to n-1
2、 k <- i
3、 for j <- i to n-1
4、 if A[j] < A [k] then k <- j
5、 end for
6、 if k != i then 交换 A[i] and A[k]
7、end for
代码如下:
void sort (int a[], int n)
{
int k=0;
int temp=0;
for(int i=1;i<n;i++)
{
k=i;
for(int j=i+1;j<n;j++)
{
if(a[j]<a[k])
k=j;
}
if(k!=i)
{
temp=a[k];
a[k]=a[i];
a[i]=a[k];
}
}
}
二、插入排序
基本思想:
从只包含一个元素的子数组A[1]开始,
接着,将元素A[2]插入到子数组A[1]的合适的位置,这个位置可能在A[1]之前或者A[1]之后,那么A[1..2] 变为有序的子数组然后,插入A[3]、A[4],直到所有的元素都插入,整个数组变为有序。
伪代码如下:
Input: An array A [1..n] of n elements.
Output: A [1..n] sorted in nondecreasing order.
1.for i <- 2 to n
2. x <- A[i]
3. j <- i-1
4. while (j>0) and (A[j]>x)
5. A[j+1] <- A[j]
6. j <- j-1
7. end while
8. A[j+1]=x
9.end for
void insertsort(int a[],int n)
{
int t;
for(int i=1;i<n;i++)
{
t=a[i];
if(a[i]<a[i-1])
{
for(int j=i-1;t<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=t;
}
}
}
三、快速排序
代码如下:
#include <bits/stdc++.h>
using namespace std;
void quicksort(int left,int right)
{
int i,j;
int t=a[left];
if(left>right) return;
i=left;
j=right;
while(i!=j)
{
while(a[j]>=t&&i<j) j--;
while(a[i]<=t&&i<j) i++;
if(i<j)
{
}
}
a[left]=a[i];
a[i]=t;
qs(left,i-1);
qs(i+1,right);
return;
}