普通选择排序
1、实现原理和思想(升序):
1)在未排序的数组中,选择首元素与其后元素进行比较,若其后元素比首元素大,则两元素交换,直至比较到最后一个元素,这是第一轮比较,得到首元素有序。
2)接下来从第2个,第3个元素…重复1)的步骤,直至剩下最后一个元素,则最后一个元素也是有序,是本组元素的最大值。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define len 10
typedef enum{
EROOR,SUCCESS
}STATUS;
STATUS selectSort(int *arr,int n){
for(int i = 0;i<len-1;i++){
for(int j = i+1;j<len;j++){
if(arr[i]>arr[j]){
arr[i]^= arr[j];
arr[j]^= arr[i];
arr[i]^= arr[j];
}
}
}
return SUCCESS;
}
int main(void){
srand(time(NULL));
int arr[len];
for(int i = 0;i<len;i++){
arr[i] = rand()%100+1;
}
selectSort(arr,len);
for(int i = 0;i<len;i++){
printf("%5d",arr[i]);
}
return 0;
}
选择排序优化——比而不换
此优化是借助记录每次比较较小值的位置,直到最后一个元素,然后比较较小值的位置和待交换元素位置是否相同,不同说明不是同一个元素则交换
STATUS selectSort(int *arr,int n){
int idx;
for(int i = 0;i<len-1;i++){
idx = i;
for(int j = i+1;j<len;j++){
if(arr[idx]>arr[j])
idx = j;
}
if(idx != i){
arr[i]^= arr[idx];
arr[idx]^= arr[i];
arr[i]^= arr[idx];
}
}
return SUCCESS;
}
普通冒泡排序
1、冒泡排序的步骤和思想(升序),其实就是邻近的数据两两交换,第一轮下来最后一个元素就是本组元素的最大值,接下来的元素都是重复此步骤。
//冒泡排序
STATUS popSort(int *arr,int n){
for(int i = 0;i<n-1;i++){
for(int j = 0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
}
}
}
}
冒泡排序优化——减少不必要的比较循环
思想:若一组数据,有序,那么只需进行一轮比较,判断这轮比较中有没有数据进行交换,若无说明数据有序,无序再进行比较,根据这个结论,设计得到这段优化代码
//冒泡排序
STATUS popSort(int *arr,int n){
int flag = 0;
for(int i = 0;i<n-1;i++){
for(int j = 0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
arr[j] ^= arr[j+1];
arr[j+1] ^= arr[j];
arr[j] ^= arr[j+1];
flag = 1;
}
}
if(flag == 0)
break;
}
}
快速排序
//快速排序
STATUS quickSort(int *p,int low,int high){
if(low < high){
int pivot = p[low];
int l = low;
int h = high;
while(l<h){
while(p[h] > pivot)
h--;
p[l] = p[h];
while(p[l] < pivot)
l++;
p[h] = p[l];
}
p[l] = pivot;
quickSort(p,low,l-1);//左递归
quickSort(p,l+1,high);//右递归
}
}