本篇文章重点描述了C++语言的四种排序算法,基本的思想如下:
1.插入排序
说明:将第2个元素到最后一个元素分别插入到前面已经排好的序列中
初始值: 5,4,3,2,1
loop1: 4,5,3,2,1(4插入到5的前面)
loop2: 3,4,5,2,1(3插入到4的前面)
loop3: 2,3,4,5,1(2插入到3的前面)
loop4: 1,2,3,4,5(1插入到2的前面)
void insertSort(int *arr,int n){
int i,j,value;
for(i = 1; i < n; i++){
value=arr[i];
j = i-1;
while(j>=0&&arr[j]>value){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = value;
}
}
2.选择排序
说明:在未排序子序列中选出最小的和未排序的第一个元素交换,从而使已经排序的子序列增长,直到最后排序完成
初始值:6,5,4,2,1
loop1:1,5,4,2,6(最小的是1,和6交换)
loop2:1,2,4,5,6(最小的是2,和5交换)
loop3:1,2,4,5,6(最小的是2,不用交换)
loop4:1,2,4,5,6(最小的是2,不用交换)
void selectSort(int *arr, int n){
int i,min,tmp,j;
for(i = 0; i < n-1; i++){
min = i;
for(j = i+1; j < n; j++){
if(arr[j]<arr[min]){
min = j;
}
}
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
3.冒泡排序
说明:在未排序的子序列中找到最大的数放到未排序的序列的最右边,从而使已排序的子序列增长,直到全部排序完成。
初始:2,1,4,5,3
loop1:1,2,4,3,5
loop2:1,2,3,4,5
loop3:1,2,3,4,5
loop4:1,2,3,4,5
void bubbleSort(int *arr,int n){
int i,j,tmp;
for(i = 0; i < n-1; i++){
for(j = 0; j < n-1-i; j++){
if(arr[j+1]<arr[j]){
tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
}
4.快速排序
说明:先把arr[low]提出赋值到t,然后从右边开始找high–,找到第1个比t小的,就交换到low的位置,然后low++,找到第一个比t大的,就交换到high的位置,然后再high–,直到low指针和high指针相遇,完成一次排序。
原始:3,2,1,4,5
low=0,high=4;
arr[low]=3,先和arr[high]=5比较,因为5>3所以high–,直到找到1<3,然后arr[low]=1,此时变化指针的流动方向,low++等到low==2时候和high相遇,结束一次循环,结果为:1,2,3,4,5
int partition(int *arr, int low, int high){
int t = arr[low];
while(low<high){
while(low<high&&arr[high]>=t)
high--;
arr[low]=arr[high];
while(low<high&&arr[low]<=t)
low++;
arr[high]=arr[low];
}
arr[low]=t;
return low;
}
void quickSort(int *arr, int low,int high){
if(low>=high)
return ;
int p = partition(arr,low,high);
quickSort(arr,low,p-1);
quickSort(arr,p+1,high);
}