三种基本排序算法
1.冒泡排序
基本原理:
{3,5,4,2,6,1}
-
比较前两个元素{【3,5】,4,2,6,1} 3<5 保持不变
-
{3,[5,4],2,6,1}
-
{3,4,[5,2],6,1}
-
{3,4,2,[5,6],1}
-
{3,4,2,5,[6,1]}
-
{3,4,2,5,1,6} 第一遍排序完成,进行下一次排序,依次类推
-
由于最后一个元素已经是最大的所以第二次排序在倒数第二次即可停止
细节:
- 每一趟排序都可以把最大数字放在最后一位。
- 最多需要n-1趟排序
代码实现:
c
void bubblesort(int arr[],int n)
{
for(int i = 0; i<n-1; i++)//外层循环用来控制排序的趟数
{
for(int j = 0 ; j< n-1-i ; j++)//由于每次排序最大的元素都会到末尾所以每次只需要排序前n-1-i个即可
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
java
public static void bubblesort(int[] arr,int n) {
for(int i = 0; i<n-1; i++)//外层循环用来控制排序的趟数
{
for(int j = 0 ; j< n-1-i ; j++)//由于每次排序最大的元素都会到末尾所以每次只需要排序前n-1-i个即可
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
2.选择排序
基本原理:{3,5,4,2,6,1}
为了方便讲解用()代表已经排好序的部分,用[ ]代表正在排序的部分
- 选择排序的基本思路是从当前数组中选取一个最大的元素,把这个元素放到末尾
- 再从剩下的元素中选取一个最大的元素,把他放在倒数第二位,依次类推
- {3,5,4,2,6,1} 其中6为最大值,把6放在末尾,{[3,5,4,2,1],(6)}
- {[3,1,4,2],(5,6)}
- 以此类推
编写代码时的一些心得
- 考虑到要交换位置,我们找最大值时,应该同时找到它的下标
代码实现:
c
void selectionsort(int arr[],int n)
{
while(n>1)
{
int pos = FindMaxPos(arr,n);
int temp = arr[pos];
arr[pos] = arr[n-1];
arr[n-1] = temp;
n--;
}
}
int FindMaxPos(int arr[],int n)
{
int max=0,pos=0;
int i;
for(i=0 ;i<n ;i++)
{
if(arr[i]>max)
{
max=arr[i];
pos=i;
}
}
return pos;
}
java
static void selectionSort(int[] arr,int n) {
while(n>1) {
int pos = findMaxPos(arr,n);
int temp = arr[pos];
arr[pos] = arr[n-1];
arr[n-1] = temp;
n--;
}
}
static int findMaxPos(int[] arr, int n) {
// TODO Auto-generated method stub
int max=0,pos=0;
for(int i= 0;i<n;i++) {
if(arr[i]>max) {
max=arr[i];
pos=i;
}
}
return pos;
}
3.插入排序
基本原理:
{3,5,4,2,6,1}
为了方便讲解用()代表已经排好序的部分,用[ ]代表正在排序的部分
- {(3,5),4,2,6,1}我们知道如果只有一个数据那么这个数组肯定是有序的,观察这个数组可知,前两个数据都是有序的,我们将4插入到这两个数据之间
- 然后,将剩下的数据依次插入即可。
- 听起来很简单,但是真正难的是插入这个过程下面我们就讲讲插入的过程。
插入
1 选取无序的第一个元素,{(3,5),4,2,6,1}即4,用一个变量key 来储存,同时令i=2,也就是当前4的位置
2 比较i-1与key的大小,如果i-1>key,把i-1的值赋给i,然后让i–,直到i-1<key为止,这样做的目的就是让比key大的元素给key让位置,最后把key的值赋给i这个位置
3 考虑到特殊情况比如 当i=0时 ,也就是说所有元素都比key大,那么i-1就变成-1了,所以我们要加一个判断,防止发生错误
代码实现:
void insert(int arr[],int n)
{
int key = arr[n];
int i = n;
while(arr[i-1]>key)
{
arr[i]=arr[i-1];
i--;
if(i==0)
break;
}
arr[i]=key;
}
void insertsort(int arr[],int n)
{
int i;
for(i=1;i<n;i++)
insert(arr,i);
}