如何排序一个整数数组
排序是计算机编程中最基本的问题之一,它可以用来解决很多问题,如查找、去重、求中位数等等。在实际工作中,我们常常需要对数据进行排序,这里介绍一下如何对整数数组进行排序。
一、冒泡排序
冒泡排序是最简单的排序算法之一,它的基本思想是:每次比较相邻两个元素,如果前一个元素大于后一个元素则交换它们的位置,这样一趟排序后最大的元素就会排在数组的最后面,然后对剩下的元素再进行排序,直到全部元素排序完毕。
冒泡排序的时间复杂度为O(n^2),最坏情况下需要进行n*(n-1)/2次比较,因此对于大数据集来说,冒泡排序效率比较低。
void bubbleSort(int a[], int n)
{
for(int i=0; i<n-1; ++i)
{
for(int j=0; j<n-i-1; ++j)
{
if(a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
二、选择排序
选择排序的基本思想是:每次从未排序的元素中选取最小值,放置在已排序的数组的末尾。经过n-1次排序,数组就排好序了。
选择排序的时间复杂度为O(n^2),与冒泡排序相同,但是由于每次只进行一次交换操作,因此选择排序的效率要略高于冒泡排序。
void selectionSort(int a[], int n)
{
for(int i=0; i<n-1; ++i)
{
int minIndex = i;
for(int j=i+1; j<n; ++j)
{
if(a[j] < a[minIndex])
minIndex = j;
}
if(minIndex != i)
{
int temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
}
三、插入排序
插入排序的思想是:假设前面的数已经有序,后面的数依次插入到合适的位置,并保持排序。具体的实现是:将一个待排序的元素插入到已经排序的数组中,并将比它大的元素依次后移,直到找到它应该插入的位置。
插入排序的时间复杂度也是O(n^2),但是由于它每次只需要移动一次元素,所以对于部分有序的数组来说,插入排序的效率要比冒泡排序和选择排序更高。
void insertionSort(int a[], int n)
{
for(int i=1; i<n; ++i)
{
int temp = a[i];
int j = i;
while(j > 0 && temp < a[j-1])
{
a[j] = a[j-1];
--j;
}
a[j] = temp;
}
}
四、快速排序
快速排序是一种高效的排序算法,它的基本思想是:选择一个基准元素,将数组分成两个部分,左边的部分都比基准元素小,右边的部分都比基准元素大,然后对左右两个部分分别进行同样的操作,直到数组有序。
快速排序的时间复杂度为O(n*log(n)),平均情况下效率是很高的。但是最坏情况下,如果选择的基准元素恰好是数组中最小或最大的元素,每次只能将待排序数组中的一个元素放在它应该在的位置上,需要进行n次递归才能完成排序,此时快速排序的效率就和冒泡排序类似,变成了O(n^2)。
void quickSort(int a[], int left, int right)
{
if (left < right)
{
int i = left, j = right, pivot = a[left];
while (i < j)
{
while (i < j && a[j] >= pivot)
--j;
if (i < j)
a[i++] = a[j];
while (i < j && a[i] < pivot)
++i;
if (i < j)
a[j--] = a[i];
}
a[i] = pivot;
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
}
以上就是对于整数数组进行排序的四种方法,每种方法都有它的优缺点,可根据实际情况选择合适的方法。
