基本思路是:将相邻的记录的关键码进行比较,若前面记录的关键码大于后面记录的关键码,则将它们交换,否则不交换。
static void Sort(int[] arrNum)//传递一个数组排序
{
//冒泡排序
for (int i = 0; i < arrNum.Length-1; i++)
{
for (int j = 0; j < arrNum.Length-1-i; j++)
{
if (arrNum[j]>arrNum[j+1])
{
int temp = arrNum[j];
arrNum[j] = arrNum[j+1];
arrNum[j+1] = temp;
}
}
}
}
方法二
static void Sort(int[] sortArray)//传递一个数组排序
{
bool swapped ;
do
{
swapped = false;//如果不发生交换,do-while则跳出循环
for (int i = 0; i < sortArray.Length-1; i++)
{
if (sortArray[i]>sortArray[i+1])
{
int temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
swapped = true;//如果发生交换,do-while则继续循环
}
}
} while (swapped);
}
基本思路是:
从左到右开始,以第一个元素 (i = 0) 作为 基准数,与后面的数作比较,找到比它小的数就置换位置,以此类推 ,以第二元素(i = 1) 作为 基准数,与后面的数比较,找到比它小的数就置换位置.直至循环结束.
//选择排序
static void SelectSort(int[] dataArray)
{
for (int i = 0; i < dataArray.Length - 1; i++)
{
//记录最小值索引
int minIndex = i;
for (int j = i + 1; j < dataArray.Length; j++)
{
if (dataArray[j] < dataArray[minIndex])
{
minIndex = j;
}
}
//交互最小值 : 当前索引就是最小值时就不用交换
if (minIndex != i)
{
int temp = dataArray[i];
dataArray[i] = dataArray[minIndex];
dataArray[minIndex] = temp;
}
}
}
基本思路是:依照从左到右顺序,从第(i = 1)元素开始,把 i 与它前面的数比较,找到小于它的数就移动元素位置
static void InsertSort(int[] dataArray)
{
for (int i = 1; i < dataArray.Length; i++)
{
int iValue = dataArray[i];
bool isInsert = false;
//拿到i位置的元素 跟前面所有的元素作比较
for (int j = i - 1; j >= 0; j--)
{
if (dataArray[j] > iValue)
{
//如果发现比i大的,就让它向后移动
dataArray[j + 1] = dataArray[j];
}
else
{
//发现一个比i小的值就停下来
dataArray[j + 1] = iValue;
isInsert = true;
break;
}
}
//如果i这个值最小,所有元素都向后移动一位了,就把这个元素放到 0 号索引上
if (isInsert == false)
{
dataArray[0] = iValue;
Console.WriteLine(iValue);
}
}
}
快速排序是几种排序方法中效率较高,因此经常被采用,采用快速排序思想----分治法 (Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
以一个数组作为示例,取区间第一个数为基准数。
初始时,i = 0; j = 9; X = a[i] = 72
由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。
从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j–;
数组变为:
i = 3; j = 7; X=72
再重复上面的步骤,先从后向前找,再从前向后找。
从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++
从i开始向后找,当i=5时,由于i==j退出。
此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。
数组变为:
可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。
static void QuickSort(int[] dataArray, int left, int right)
{
if (left < right)
{
//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
int x = dataArray[left];
int i = left;
int j = right;
while (i < j)//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置
{
//从后往前比较
//找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
while (i < j)
{
if (dataArray[j] <= x)
{
dataArray[i] = dataArray[j];
break;
}
else
{
j--;//向左移动 到下一个数字,然后做比较
}
}
//从前往后
while (i < j)
{
if (dataArray[i] > x)
{
dataArray[j] = dataArray[i];
break;
}
else
{
i++;
}
}
}
//跳出循环 现在i==j i是中间位置
dataArray[i] = x;
QuickSort(dataArray, left, i - 1);// left -i- right
QuickSort(dataArray, i + 1, right);
}
}
调用
QuickSort(data, 0, data.Length - 1);
CLR提供的排序方法:Array.Sort()