有好多种排序方法
- 选择排序
- 快速排序
- 冒泡排序
- 插入排序
等等
选择排序
基本思想:
假设排序表为L[1…n],第i趟排序从表中选择关键字最小的元素与Li交换,第一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。
代码:
- void SelectSort(ElemType arr[], int length)
{
int i, j, min;
ElemType tmp;
for (i = 0; i < length - 1; ++i) // 需要n-1趟
{
min = i;
for (j = i + 1; j < length; ++j)
{
if (arr[j] < arr[min]) // 每一趟选择元素值最小的下标
{
min = j;
}
}
if (min != i) // 如果第i趟的Li元素值该趟找到的最小元素值,则交换,以使Li值最小
{
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}
快速排序
基本思想:
基于分治法,在待排序的n个元素中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1..k-1]和L[k+1 .. n],使得第一部分中的所有元素值都小于pivot,而第二部分中的所有元素值都大于pivot,则基准元素放在了其最终位置L(K)上,这个过程为一趟快速排序。而后分别递归地对两个子表重复上述过程,直到每部分内只有一个元素或为空为止,即所有元素都放在了其最终位置上。
代码:
- int Partition(ElemType arr[], int left, int right)
{
ElemType pivot = arr[left]; // 以当前表中第一个元素为枢轴值
while (left < right)
{
// 从右向左找一个比枢轴值小的元素的位置
while (left < right && arr[right] >= pivot)
{
--right;
}
arr[left] = arr[right]; // 将比枢轴值小的元素移动到左端
// 从左向右查找比枢轴值大的元素的位置
while (left < right && arr[left] <= pivot)
{
++left;
}
arr[right] = arr[left];// 将比枢轴值大的元素移动到右端
}
arr[left] = pivot; // 将枢轴元素放在最终位置
return left;
}
- void QuickSort(ElemType arr[], int left, int right)
{
if (left < right)
{
int pivotPos = Partition(arr, left, right); // 划分
QuickSort(arr, left, pivotPos - 1); // 快速排序左半部分
QuickSort(arr, pivotPos + 1, right); // 快速排序右半部分
}
}
冒泡排序
基本思想:
假设待排序的表长为n, 从后向前或从前向后两两比较相邻元素的值,若为逆序,则交换之,直到序列比较完。这样一回就称为一趟冒泡。这样值较大的元素往下“沉”,而值较小的元素入上“浮”。
结果展示:
/*冒泡排序 分析详解:
原始数据: 28, 30, 19, 2, 23
第一趟:
第一次:28, 30, 19, 2, 23
第二次:28, 19, 30, 2, 23
第三次:28, 19, 2, 30, 23
第四次:28, 19, 2, 23, 30
第二趟:
第一次:19, 28, 2, 23, 30
第二次:19, 2, 28, 23, 30
第三次:19, 2, 23, 28, 30
第三趟:
第一次:2, 19, 23, 28, 30
第二次:2, 19, 23, 28, 30
第四趟:
第一次:2, 19, 23, 28, 30
*/
代码:
void BubbleSort(ElemType arr[], int length)
{
int i, j;
ElemType tmp;
for (i = 0; i < length - 1; ++i)// 趟次
{
for (j = i + 1; j < length; ++j)
{
if (arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
插入排序
基本思想:
将等排序列划分为有序与无序两部分,然后再依次将无序部分插入到已经有序的部分,最后就可以形成有序序列。
操作步骤:
1)查找出元素L(i)在表中的插入位置K;
2)将表中的第K个元素之前的元素依次后移一个位置;
3)将L(i)复制到L(K)。
代码:
-(void)insertSortWithArray:(NSArray *)aData{
NSMutableArray *data = [[NSMutableArray alloc]initWithArray:aData];
for (int i = 1; i < [data count]; i++) {
id tmp = [data objectAtIndex:i];
int j = i-1;
while (j != -1 && [data objectAtIndex:j] > tmp) {
[data replaceObjectAtIndex:j+1 withObject:[data objectAtIndex:j]];
j--;
}
[data replaceObjectAtIndex:j+1 withObject:tmp];
}
NSLog(@"插入排序后的结果:%@",[data description]);
[data release];
}