排序算法有十大经典算法,随便网上一搜都是一堆,1.冒泡排序、2.选择排序、3.插入排序、4.希尔排序、5.归并排序、6.快速排序、7.堆排序、8.计数排序、9.桶排序、10.基数排序。
在这里就把前三种复习一下,假设都是递增排序。
冒泡排序:从前到后不断比较相邻元素,如果后面元素比前面元素小,就交换(第二层for循环)。前面的操作一共操作size次(第一层for循环)。关于冒泡排序还有一个特别的地方,它不改变相同元素的相对位置。
//冒泡,一直比较相邻元素,不改变顺序:
for (i = 0; i < size - 1; i++) {// i表示排序次数
for (j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j+1]) {// 交换
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
选择排序:从剩余元素中挑选最小的一个(第二层for循环)。把最小的元素和当前元素交换,然后继续向下一个元素扫描(第一层for循环):
//选择:从剩余元素中选择最小的替换
for (i = 0; i < size - 1; i++) {
k = i;
for (j = i + 1; j < size; j++)
if (arr[j] < arr[k]) k = j;
tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
插入排序:轮询数组,如果当前元素比上一元素大(第一层for循环),就把它插入到前面元素的合适位置上(第二层for循环):
//插入:当前元素不是有序的就放入到前面合适位置
for (i = 1; i < size; i++) {
if (arr[i] < arr[i-1]) {
tmp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = tmp;
}
}
写个简短程序跑一下,看下效果:
// 冒泡
void BubbleSort(int *arr, int size) {
int i, j, tmp;
printf("0-BubbleSort:\n");
//冒泡,一直比较相邻元素,不改变顺序:
for (i = 0; i < size - 1; i++) {// i表示排序次数
for (j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j+1]) {// 交换
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
// 选择
void SelectionSort(int *arr, int size) {
int i, j, k, tmp;
printf("1-SelectionSort:\n");
//选择:从剩余元素中选择最小的替换
for (i = 0; i < size - 1; i++) {
k = i;
for (j = i + 1; j < size; j++) // 从剩余元素中选择最小的
if (arr[j] < arr[k]) k = j;
tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
}
// 插入
void InsertionSort(int *arr, int size){
int i, j, tmp;
printf("2-InsertionSort:\n");
//插入:当前元素不是有序的就放入到前面合适位置
for (i = 1; i < size; i++) {
if (arr[i] < arr[i-1]) {
tmp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {
arr[j+1] = arr[j];
}
arr[j+1] = tmp;
}
}
}
int main(){
int arrInt[10] = {3,5,4,2,6,1,9,7,10,8};
int i;
scanf("%d", &i);
switch(i) {
case 0:
BubbleSort(arrInt, 10);
break;
case 1:
SelectionSort(arrInt, 10);
break;
case 2:
InsertionSort(arrInt, 10);
break;
}
for (i = 0; i < 10; i++) {
printf("%d ", arrInt[i]);
}
while (1) {} // 保持程序不结束,方便查看打印结果
return 0;
}