普通的排序方法是依靠for的双重循环,时间复杂度为O(n^2)。而近段时间我学习了两种方法,在这里分享下。
一、c++中sort的函数
sort 的函数的头文件是#include<algorithm>.
sort()函数可以帮助我们把数组从小到大排列好,以int型数组为例:
这里我是直接将int型数组初始化,运行结果为:
显然这里的数组中元素的排序是杂乱无章的。通过sort()函数,我们可以这样写:
运行后结果为:
数组顺序都排列好了。
二、快排
其实快排的原理是运用了双指针,通过同时从数组的头和尾,来进行标记、交换来达到排序的目的。
i标记数组的第一个元素,j标记数组的最后一个元素。
这里的if(head > end )是判断如果数组只有一个元素,则返回和在递归中,程序结束的语句。不然会陷入死循环。
这里的temp是一个基点,用来划分数组两面数字的基准线。
在快排过程中,应该从最后一个元素(即j)开始:
在j这边,如果array[j]是大于等于temp,则j--,继续判断知道array[j]小于temp,此后i这边也是同理,直到array[i]是大于temp。此时i与j的位置没动,交换array[i]和array[j]元素的位置。
最后将第一个元素的位置与,i==j那个位置进行交换
然后利用递归再将准线两边的排序
函数完整代码如下:
void Qicksort(int array[], int head, int end)
{
if (head >= end)
return;
int temp = array[head];
int i = head;
int j = end;
while (i!=j)
{
while (array[j] >= temp&& i < j)
{
j--;
}
while (array[i] <= temp&& i < j)
{
i++;
}
if (i < j)
{
swap(array[i], array[j]);
}
}
swap(array[head], array[i]);
Qicksort(array, head, i - 1);
Qicksort(array, i + 1, end);
}
三、插入排序
#include<bits/stdc++.h>
using namespace std;
void cp(int a[])
{
int i = 0, j = 1;
for (j = 1; j <= 4; j++)
{
int temp = 0;
if(a[i] > a[j])
{
temp = a[j];
while (temp < a[i])
{
a[i + 1] = a[i];
i--;
}
a[i + 1] = temp;
}
i = j;
}
}
int main()
{
int a[5] = { 1,5,2,9,3 };
cp(a);
return 0;
}
四、选择排序
#include<bits/stdc++.h>
using namespace std;
#define INF 9999
void exchange(int i, int j, int a[])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void xp(int a[])
{
int i, j;
for (i = 0; i < 5; i++)
{
int min = INF;
int v = 0;
for (j = i; j < 5; j++)
{
if (min > a[j])
{
min = a[j];
v = j;
}
}
exchange(i, v, a);
cout << a[i] << " ";
}
}
int main()
{
int num[5] = { 1,9,5,4,3 };
xp(num);
return 0;
}
五、希尔排序
#include<bits/stdc++.h>
using namespace std;
int n;
void cp(int a[],int x,int len)
{
int temp = a[x];
while (x - len >= 0 && temp < a[x - len])
{
a[x] = a[x - len];
x = x - len;
}
a[x] = temp;
}
void xrp(int a[], int len,int t)
{
for (int i = 0; i < n / t; i++)
{
int x = i;
while (x < n)
{
if (a[x] >= a[x - len] || x-len < 0)
x = x + len;
else
{
cp(a, x, len);
x += len;
}
}
}
for (int i = 0; i < 8; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
n = 8;
int a[8] = { 1,5,8,4,7,2,6,3 };
int len = n / 2;
int i = 2;
while (len >= 1)
{
xrp(a, len, i);
len /= 2;
i++;
}
return 0;
}