4种面试中常见的排序方法
一:冒泡排序:
思路:相邻两个元素之间的比较。例如将一数组按从小到大排列:第一轮两个元素相比较,将数组中最大的元素放到数组的最末尾;第二轮两个元素相比较,将数组中次大的元素放到数组的倒数第二位,此时不用和最后一个元素相比较了;第三轮两个元素相比较,将第三大的元素放在数组的倒数第三的位置上,此时也不用比较和倒数第二个数和倒数第一个数相比较了;然后依次类推得出结果。
代码:
void bubblesort(int a[], int len) {
int i, j;
for (i = 1; i < len; ++i) {
for (j = 0; j < len - i; ++j) {
if (a[j] > a[j + 1]) {
int k = a[j];
a[j] = a[j + 1];
a[j + 1] = k;
}
}
}
}
二:选择排序
思路:两个元素相比较,注意不一定是相邻的元素哦!例如将一数组从小到大排列,第一轮先找到最大的元素然后和数组最后一个元素相交换;第二轮找到次大的数与数组倒数第二个元素相交换,以此类推....
代码:
void selcetsort(int a[], int len) {
int i, j, max,t = 0;
for (i = 1; i < len; ++i) {
max = len - i;
for (j = 0; j < len - i; ++j) {
if (a[j] > a[max]) {
max = j;
}
}
if (max !=len - i) {
t = a[j];
a[j] = a[max];
a[max] = t;
}
}
}
三:插入排序
思路:第一轮以下标为1的元素为基准,将前面的元素与此基准相比较;第二轮以下标为2的元素为基准,将前面的元素与此基准相比较;以此类推。
代码:
void insertsort(int a[], int len) {
int i, j, k;
for (i = 1; i < len; ++i) {
k = a[i];
for (j = i; j > 0; --j) {
if (a[j - 1] > k) {
a[j] = a[j - 1];
} else
break;
a[j - 1] = k;
}
}
}
四:快速排序
思路:第一轮排序:1)先以首元素为基准,假设首元素npivot=14,设定两个指针指向i,j分别指向数组的首尾元素;2)向前移动指针j直到指向第一个小于14的元素,并将此元素置换到i所指向的位置;3)向后移动指针i直到指向第一个大于14的元素,并将此元素置换到j所指向的位置;4)然后继续执行2)3),当i==j时,则将14放在i或j的位置上;然后后面的几轮排序则使用递归的方式继续
int quickoncesort(int a[],int low,int high){//第一轮排序
int i=low,j=high,npivot=a[low];
while(i<j){
while(i<j&&a[j]>=npivot){
--j;
}
a[i]=a[j];
while(i<j&&a[i]<=npivot){
++i;
}
a[j]=a[i];
}
a[i]=npivot;
return i;
}
void quicksort(int a[],int low,int high){//以后用递归的方式来排序
if(low>=high)return;
int npivotindex=quickoncesort(a,low,high);
quicksort(a,low,npivotindex-1);
quicksort(a,npivotindex+1,high);
}
int main() {//主函数
int a[10] = { 9, 5, 7, 3, 6, 4 };
// bubblesort(a,6);
// insertsort(a, 6);
quicksort(a,0,5);
int i;
for (i = 0; i < 6; ++i) {
printf("%d", a[i]);
}
return 0;
} |
|