冒泡排序
遍历数据,比较相邻数据 大小 ,依次交换相邻数据
手上17上扑克牌 从最左边(或最右边)相邻扑克牌比较大小后交换位置(第一张和第二张比,最大的放最右边。第二张和第三张比,最大的放最右边。依此次序比完17张牌。那么第17张为最大,将剩下的16张依上方法,在比一次。依次比剩下的15张,14,13等等等)(优化是 当比较一轮剩余的牌的时候(17,16,15等等等)若没有大小置换,即表示早已排好序,无需排剩下的牌)
#include<iostream>
using namespace std;
void bubblesort(int str[],int len)
{
for(int i=0;i<len-1;i++)
{
int count=0;//count用来控制:当遍历完成之前已排好序时,不再继续遍历
for(int j=len-1;j>i;j--)
{
if(str[j-1]>str[j])
{
int temp=str[j-1];
str[j-1]=str[j];
str[j]=temp;
count=1;
}
}
if(count==0) break;
cout<<"第"<<i+1<<"次遍历结果:";
for(int a=0;a<len;a++)
cout<<str[a]<<" ";
cout<<endl;
}
}
int main()
{
int str[5]={5,2,6,3,7};
int len=sizeof(str)/sizeof(str[0]);
bubblesort(str,len);
cout<<"最终排序结果:";
for(int i=0;i<len;i++)
cout<<str[i]<<" ";
cout<<endl;
return 0;
}
选择排序
遍历数据 ,将数据中最小值放入数据前 。接着找出剩下数据最小值 依旧放入剩下数据最前
17张牌,找出最小的放入最前,接着找出剩余的牌中最小的值放入剩余牌的最前面。依次循环
#include <iostream>
using namespace std;
void select_sort(int array[],int length)
{
cout << length <<endl;
int k ;
for (int i = 0 ; i < length ;i ++)
{
int min = i,k;
for(int j = i +1 ; j < length ; j++)
{
if (array[j] < array[min])
{
min = j;
}
}
if (min != i)
{
k = array[i];
array[i] = array[min];
array[min] = k;
}
}
}
int main ()
{
int array[] = {99,1,3,4,8,12,24,66,43,31};
select_sort(array,sizeof(array)/sizeof(int));
for (int i = 0 ;i < sizeof(array)/sizeof(int);i++)
{
cout << array[i] << endl;
}
return 0;
}
插入排序
和抓牌一样 ,抓起一张,按照大小,将牌插入已经抓好的牌中
#include "stdafx.h"
int A[10] = {3,2,6,4,1,5,7,9,8,10};
void Insert_Sort(int *A, int length)
{
for(int j = 1; j < length; j++)
{
int key = A[j];
int i = j - 1;
while(i >= 0 && A[i] > key)
{
A[i+1] = A[i];
i = i - 1;
}
A[i+1] = key;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Insert_Sort(A,10);
for(int i = 0; i < 10; i++)
{
printf("%d ", A[i]);
}
return 0;
}
希尔排序
按照牌数多少,进行排序 ,手上10张牌 抽出间隔为5的两张牌来比较 进行排序交换。 在抽出间隔为2的五张牌来比较,进行排序 交换 。在抽出间隔为1的10张牌进行排序。
#include <iostream>
#include <stdlib.h>
using namespace std;
void ShellSort(int array[], int Length) //希尔排序函数
{
int i, j, step;
//step步长是根据10个元素这种情况定义的
for (step = Length/ 2; step > 0; step = step / 2)
{
for (i = 0; i < step; i++) //i是子数组的编号
{
//数组下标j,数组步长下标j+step
for (j = i + step; j < Length; j = j + step)
{
if (array[j] < array[j - step])
{
int temp = array[j]; //把数组下标j的值放到temp中
int k = j - step;
while (k >= 0 && temp < array[k])
{
array[k + step] = array[k]; //把大的值往后插入
k = k - step;
}
array[k + step] = temp; //把小的值往前插入
}
}
}
}
}
int main(void) //主程序
{
const int n = 10; //数组元素的数量
int array[n];
cout << "请输入10个整数:" << endl;
for (int i = 0; i < n; i++)
{
cin >> array[i];
}
cout << endl; //换行
ShellSort(array, n); // 调用BubbleSort函数 进行比较
cout << "由小到大的顺序排列后:" << endl;
for (int i = 0; i < n; i++)
{
cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
}
cout << endl << endl; //换行
system("pause"); //调试时,黑窗口不会闪退,一直保持
return 0;
}